Я видел объекты, созданные в коде Java без сохранения ссылки на объект. Например, в плагине eclipse я видел SWT Shell, созданный так:
new Shell();
Этот новый объект Shell не сохраняется в переменной, но на него будут ссылаться до тех пор, пока окно не будет удалено, что [по моему мнению?] Происходит по умолчанию при закрытии окна.
Плохо ли создавать подобные объекты, не сохраняя ссылки на них? Или библиотека была плохо спроектирована? Что если мне не нужна ссылка, а нужны только «побочные эффекты» объекта? Должен ли я хранить ссылку в любом случае?
ОБНОВИТЬ:
Надо признать, мой приведенный выше пример плохой. Хотя я видел элементы пользовательского интерфейса, созданные таким образом, создание подобной оболочки SWT, вероятно, было бы бессмысленным, поскольку вам нужно вызывать метод open в экземпляре оболочки. AIX предлагает лучшие примеры, такие как следующие из руководства по параллелизму Java :
(new HelloThread()).start();
Эта практика видна во многих контекстах, поэтому вопросы остаются. Это хорошая практика?
Shell.createTopLevelShell()
или любой другой, по сравнению с использованием конструктора в этом случае. Но функционально есть небольшая разница.)dispose()
d: Правило 1: Если вы его создали, вы его утилизируете. eclipse.org/articles/swt-design-2/swt-design-2.htmlОтветы:
Есть элемент личного предпочтения этому, но я думаю, что не хранить ссылку не обязательно плохая практика.
Рассмотрим следующий гипотетический пример:
Если для каждого файла требуется создать новый объект процессора и он не нужен после
process()
вызова, нет смысла хранить ссылку на него.Вот еще один пример, взятый из руководства по параллелизму Java :
Я видел много других примеров, когда ссылка не сохранена, и которые читаются мне очень хорошо, например:
(
StringBuilder
Объект не сохранился.)Существуют сходные схемы, связанные с Common.lang
HashCodeBuilder
и соавт.источник
getInstance()
является фабричным, а не единичным).process
.Если вы этого не сделаете нужна ссылка на созданный объект, не держитесь за ссылку. Это так просто.
источник
Как правило, рекомендуется выпускать ссылки настолько быстро, насколько это возможно. Я не вижу разницы между:
а также
Что касается кода, вы просто избегаете использования имени переменной, что может быть положительным моментом. JIT-компилятор, как правило, достаточно умен, чтобы признать, что может собирать поток после его последнего использования, поэтому, вероятно, нет никакой разницы с точки зрения производительности.
Единственная реальная проблема, которую следует избегать, это код в конструкторе Anti-Pattern , но это не похоже на то, о чем вы спрашиваете.
источник
Это может быть плохо, если вы используете SWT, потому что там вам придется убирать за собой (вызывая метод dispose ()). Но для других классов (не SWT) это нормально.
Вот статья об управлении ресурсами операционной системы
источник
Прежде всего, вы будете раздражать людей, которые изучили C или C ++ до Java. Я оставлю это как упражнение для читателя, чтобы решить, является ли это за или против.
Хотя, безусловно, существуют ситуации, когда объекты спроектированы так, чтобы быть очень короткими, большинство случаев, если что-то достаточно сложное, чтобы создать объект, для этого достаточно сложно иметь веские причины для сохранения ссылки, поэтому не следует ее сохранять в по крайней мере, предупреждение дважды проверить, если вы что-то пропустили.
Например, в учебнике никто не заботится о сохранении ссылки на поток, но в реальной жизни, если что-то занимает достаточно много времени, чтобы вы хотели порождать поток, обычно это занимает достаточно много времени, чтобы вы могли иметь возможность отменить поток. Или если вы живете недолго, вы обычно создаете кучу потоков, которые захотите,
join
прежде чем продолжить. Или вы хотите убедиться, что создание вашего потока действительно успешно. Или вы хотите удостовериться, что поток завершается чисто перед выходом. Вы получаете картину.источник