P.S. Всё-таки нужно избавляться от иммутабельных объектов в пользу классических бинов. Уникальность объектов (их одинаковость в мультитредовой среде) должна обеспечиваться не иммутабельностью, а синглетонами.
Позволю себе заметить, что сия фраза вне контекста, звучит, как «да здравствуют глобальные блокировки».
Подразумевалось «да здравствуют указатели на одну область памяти». Объекты в большинстве своём в последствии неизменяемы, но хранятся во множестве одинаковых экземпляров. А ещё в нашем случае финализированные приватные переменные накладывают определённые ограничения на порядок инициализации.
И, позвольте поинтересоваться, в чем соль использовать «getString» вместо «getObject»?
Ни в чём. Привычнее. getObject будет дешевле? Если да - исправлю, без проблем.
А ещё в нашем случае финализированные приватные переменные накладывают определённые ограничения на порядок инициализации.
А паттерн ServiceLocator + ленивая инициализация? Это позволяет распределить инициализацию по времени.
getObject будет дешевле?
Не скажу, ибо тестов не проводил, но теоретически там не будет лишней конвертации в строку, которая, в общем случае, в зависимости от СУБД и не для всех типов допустима.
А паттерн ServiceLocator + ленивая инициализация? Это позволяет распределить инициализацию по времени.
Поясню примером:
class SomeObject {
private final LazyInitialized<AnotherObject> resourceRef = new LazyInitialized<AnotherObject>(new Callable<AnotherObject>() {
public AnotherObject call() {
return ServiceLocator.locate(AnotherObject.class);
}
});
}
Это конечно не всегда примелимо, но различные глобальные объекты, которые надо один раз инициализировать. От синглтонов отличается, тем что нет зависимости от реализации, и вовсе не обязано быть глобальным синглтоном.
В данном конкретном случае оно не совсем применимо. Сейчас иммутаблы (конкретно class Topic) заполняются из ResultSet'ов; соответственно, конструктор содержал параметр ResultSet-типа, что для юнит-тестирования было совсем нехорошо (да и для DTO-объекта тоже нехорошо: не должен DTO знать способы своего наполнения, он по идее предоставляет только геттеры и сеттеры). Пришлось добавить второй конструктор, в котором параметрами практически перечислены все финальные переменные класса. То есть, Topic - это DTO, который может быть различным между потоками и я, если честно, не вижу смысла делать его иммцутабельным. Есть другие DTO - Section,например. Или Group. Они более-менее статичны и меняются только прямым SQL-запросом и последующим рестартом приложения :) Вот для них ServiceLocator, пожалуй, и можно было бы применить... или синглетоны, как я ранее говорил.
Сейчас в приложении всё, что напоминает DTO сделано почему-то иммутабельными объектами (с конструктором и ResultSet-параметром к нему). Может, это какой-то паттерн а я сейчас махая шашками его разрушаю?
Сейчас в приложении всё, что напоминает DTO сделано почему-то иммутабельными объектами (с конструктором и ResultSet-параметром к нему). Может, это какой-то паттерн а я сейчас махая шашками его разрушаю?
Это лучше к авторам кода, такие вопросы, по опыту ковыряния в legacy коде, можно предположить что это «стиль» вызванный с одной стороны тем что иммутабельность - суть хорошо, с другой стороны тем что писать на каждый DTO фабрику, и строитель, или ваять гигантские конструкторы кто-то не хотел.
С другой стороны типов объектов не так много, иммутабельность позволяет беречь ноги (от пули), а множество копий объектов можно разрулить пулом, если я верно помню то в JPA, что-то подобное. Однако, потрохов ЛОРа я не знаю, потому это уже гадание на кофие.
Вы там уже определитесь, запрещать анонимуса везде или открыть доступ в новости, тех.разделы, толксы (выбрать два варианта из трех). А то не понятно, начинать драму или еще подождать ;)
Логика вывернутая. Никто не ходит с табличкой на лбу «Звать меня так-то, я живу там-то, тусуюсь там-то с теми-то тогда-то». И наш суперадекватный Мегабакс тоже, заметь. Это символизирует.