По моему опыту, вы можете получить довольно далеко с объявлением final
, независимо от вашей IDE.
public class ImmutableThing {
private final int someInt;
private final String aString;
}
Идея здесь заключается в том, что вы устанавливаете их один раз в конструкторе, скажем, а затем никогда не прикасаетесь к ним снова. (Вы можете предоставить методы настройки, которые более понятны, но передают нежелательное представление о том, что этот объект является изменяемым.) Eclipse, IntelliJ и т. Д. Должны заметить объявление final
и, естественно, сказать вам, когда у вас есть код, пытающийся заглушить эти вещи, когда это не должно. (Я забываю, скажут ли они вам, объявили ли вы конечную переменную экземпляра и не предоставили никакого способа ее установить.)
Один из кривых, на которые нужно обратить внимание, будет, конечно, объектами, поля которых могут быть изменены без изменения значения поля в вашем ImmutableThing
:
private final List<String> strs; // Hmm.
Вы можете настроить strs
в конструкторе, как указано выше, но содержимое, которое List
«s, конечно, может быть изменен, так что нет ничего хорошего. В общем, любой изменяемый объект внутри объекта, который вы хотите быть неизменным, будет иметь эту проблему. Вы можете обойти эту проблему в случае Collections
(вероятно, наиболее часто изменяемых объектов) с помощью нередактируемым коллекции:
strs = Collections.unmodifiableList<String>(initList);
или с использованием версий третьих сторон, например, от гуавы:
strs = ImmutableList<String>.of ("x", "y", "z");
Другие объекты могут обеспечивать непревзойденные возможности; они не могут. Доступность этой функции, скорее всего, повлияет на то, как далеко вы достигнете этой парадигмы. Вообще говоря, вы можете получить довольно далеко с неизменяемыми объектами данных, и не очень далеко с врожденными состояниями, такими как потоки и пулы соединений.
Спасибо, да, но я хочу знать, где мне еще нужно добавить окончательный, немодифицируемый список и т. Д. –
Хмм. Представленные выше фрагменты были приведены в качестве примеров. Итак, если вы хотите, чтобы что-то было неизменным, вы бы сделали его похожим на «ImmutableThing» выше. Объявление всех его полей как «final». Предполагая, что это не поможет - не могли бы вы дать больше информации о чем-то конкретном, что вы пытаетесь сделать, может быть? –
Ну, мой первоначальный вопрос был в том, можно ли заставить Eclipse дать предупреждение в таких случаях. Дайте указание, где вещи изменяемы. Конечно, я могу проверить свой код вручную, но у меня есть 30-летние годы императивных привычек, которые наверняка заставят меня по пути. Ваши примеры - именно то, что я хочу сделать; Мне просто хотелось бы помочь в определении того, куда он пойдет. –