Я нашел блог, в котором предлагается избегать использования ключевого слова new
при создание объекта класса. Вот несколько примеров создания объекта без ключевого слова new
:
SampleObject obj = Class.forName("com.example.SampleObject").newInstance();
Или используя метод clone()
-
SampleObject obj1 = new SampleObject();
SampleObject obj2 = obj.clone();
Затем здесь у меня есть нашел несколько хороших примеров создания объекта без ключевого слова new
Я могу понять преимущества шаблона "Factory", избегая при этом ключевого слова new
в основной части кода. Если я не использую какой-либо шаблон проектирования (для создания объектов), есть ли преимущества от создания объекта без ключевого слова new
? Или каковы причины создания объекта без new
?
5 ответов
То, что вы читаете в блоге, должно быть, было посвящено фабричным методам и аналогичным методам, которые не избегают new
, а скорее помещают их в более гибкий API.
У оператора new
определенно нет общих недостатков. Он был и останется основным продуктом любого Java-кода и наиболее естественным способом создания объекта, в отличие от решения более общих задач, таких как «предоставьте мне точку входа в ваш API».
Все другие методы создания объектов без использования new
являются инструментами специального назначения (клонирование, десериализация и т. Д.).
newInstance0()
, там много кода :). Обеспечивает ли какой-либо другой метод более высокую производительность, чем new
?
new
является целью наиболее агрессивных оптимизаций со стороны среды выполнения, включая Escape Analysis с перспективой вообще не выделять объект, в принципе невозможно добиться большей эффективности, чем new
. Как всегда, используйте стандартные идиомы и наслаждайтесь преимуществами оптимизирующего монстра, которым стал HotSpot.
Сложные объекты
В общем, вы можете избегать new
для достаточно сложных объектов с нетривиальным созданием. Вы можете рассмотреть некоторые фабрики / строители, которые добавляют универсальности.
Например, если вы создаете большой составной объект, хорошо использовать шаблон построителя. (здесь длинный пример)
Простые объекты
Для простых объектов (наиболее частый случай) лучше всего использовать new
.
Например, если у вас простой класс
public class Dog{
private string name;
//getter + setter
}
Тогда создание фабрики для этого будет излишним, и вы должны вызвать это через new Dog()
Внедрение зависимостей
В корпоративных приложениях вы обычно используете внедрение зависимостей, что позволяет вам явно избегать использования new
. Вы не удалите все экземпляры объектов, но это дает хорошее улучшение. (Базовое руководство по Spring здесь)
Нет замены для new
, даже Class.forName("XYZ").newInstance()
ИМЕЕТ работать точно так же, как new
, с той лишь разницей, что вы жестко кодируете весь класс (или даже package...class
), следовательно, на самом деле достигается противоположность тому, что вы пытаетесь сделать, с new
экземпляр может быть динамически разрешен и / или даже внедрен.
Если вы внедрите экземпляр interface A
, вы вполне можете получить bean-компонент класса B
, который реализует A
- на самом деле он более динамичен и очень хорошо дополняет фабричные шаблоны. Это вряд ли возможно, если ваше имя класса жестко запрограммировано, по крайней мере, по моему скромному мнению.
Когда вы используете Class.forName, имя класса может быть установлено во время выполнения. Это может быть полезно для водителей, например.
Когда вы используете new, вместо этого имя класса создаваемого экземпляра жестко запрограммировано. Как правило, это создает сильную взаимосвязь, и этого следует избегать (кроме случаев, когда вы абсолютно уверен, что эта муфта вам понадобится всегда).
Короче говоря, если вы хотите создать экземпляр определенного класса , new
не причинит вреда.
Однако вы должны спросить себя:
- Если вам действительно нужен новый экземпляр (в противном случае вам следует заменить
new
на синглтон или бассейн). - Если вы всегда будете использовать один и тот же класс для этого экземпляра (в противном случае вам следует заменить
new
на Dependency Инъекция или Factory Pattern).
Если вам нравится вялый, медленный код, который сложно отлаживать, поддерживать и понимать, категорически избегайте использования ключевого слова new
любой ценой, запутывайте его как можно больше!
new
на вашем заводе.
Похожие вопросы
Связанные вопросы
Новые вопросы
java
Java — это высокоуровневый объектно-ориентированный язык программирования. Используйте этот тег, если у вас возникли проблемы с использованием или пониманием самого языка. Этот тег часто используется вместе с другими тегами для библиотек и/или фреймворков, используемых разработчиками Java.
static
для создания объектов. Что-то вродеPaths.get
для стандартной библиотеки.