我找到了一些博客,其中建议避免使用关键字new
而创建类的对象。创建不带 new
关键字的对象的一些示例是-
SampleObject obj = Class.forName("com.example.SampleObject").newInstance();
或者使用clone()
方法——
SampleObject obj1 = new SampleObject();
SampleObject obj2 = obj.clone();
然后在这里我找到了一些没有new
关键字创建对象的好例子
我可以理解"工厂"模式的优点,同时避免new
代码主要部分的关键字。如果我不使用任何设计模式(用于创建对象(,在没有 new
关键字的情况下创建对象有什么好处吗?或者创建没有new
的对象的原因是什么?
你在博客中读到的内容一定是关于工厂方法和类似技术的,这些技术不会避免new
,而是将其放在更灵活的API后面。
new
运营商肯定没有总体缺点。它一直是,并将继续是任何Java代码的主要内容,也是实际创建对象的最自然方式,而不是满足更普遍的问题,例如"为我提供API的入口点"。
创建对象而不涉及new
的所有其他技术都是专用工具(克隆、反序列化等(。
复杂对象
一般来说,您可以考虑避免使用非平凡创建来new
相当复杂的对象。您可以考虑一些增加多功能性的工厂/制造商。
例如,如果您创建一个大型复合对象,最好使用构建器模式。(这里长例子(
简单对象
对于简单的对象(最常见的情况(,最好坚持使用 new
.
例如,如果您有简单的类
public class Dog{
private string name;
//getter + setter
}
那么为此创建工厂是矫枉过正的,您应该通过new Dog()
来称呼它
依赖注入
在企业应用程序中,您通常使用依赖关系注入,这样可以避免显式使用new
。您不会删除所有对象实例化,但它提供了很好的改进。(此处为春季基础教程(
没有替代品可以替代new
,即使Class.forName("XYZ").newInstance()
必须像new
一样工作,唯一的区别是你正在硬编码整个类(甚至package...class
(,因此实际上实现了与你想要做的相反的效果,new
实例可以被动态解析和/甚至注入。
如果你注入一个interface A
的实例,你很可能会得到一个实现A
的类B
的bean——这实际上更加动态,并且很好地补充了工厂模式。如果你的类名是硬编码的,那几乎是不可能的,至少以我的拙见。
使用 Class.forName 时,可以在运行时设置类名。这对驾驶员很有用,例如
相反,当您使用 new 时,您创建的实例的类名是硬编码的。通常,这会产生高耦合,应避免(除非您绝对确定始终需要这种耦合(。
简而言之,如果要创建特定类的实例,new
不会造成任何伤害。
但是,您应该问自己:
- 如果您确实需要一个新实例(否则,您应该将
new
替换为单例或池(。 - 如果始终对该实例使用相同的类(否则,应将
new
替换为依赖项注入或工厂模式(。
如果你喜欢缓慢、缓慢的代码,那很难调试、维护和理解,绝对不惜一切代价避免使用new
关键字,