我找到了一些博客,其中建议避免使用 new
关键字
创建一个类的对象。在没有 new
关键字的情况下创建对象的一些示例是 -
SampleObject obj = Class.forName("com.example.SampleObject").newInstance();
或使用clone()
方法 -
SampleObject obj1 = new SampleObject();
SampleObject obj2 = obj.clone();
然后here我找到了一些不使用 new
关键字创建对象的好例子
我能理解'工厂'模式,同时避免代码主要部分中的 new
关键字。如果我没有使用任何设计模式(用于创建对象),那么在没有 new
关键字的情况下创建对象有什么好处?或者在没有 new
的情况下创建对象的原因是什么?
答案 0 :(得分:7)
您在博客中看到的内容必须是工厂方法和类似技术,它们不会避免 new
,而是将其置于更灵活的API之后。
new
运算符没有明确的缺点。它已经并将继续是任何Java代码的主要内容,也是实际创建对象的最自然的方式,而不是满足更普遍的关注,例如“为我提供API的入口点”。 / p>
在不涉及new
的情况下创建对象的所有其他技术都是专用工具(克隆,反序列化等)。
答案 1 :(得分:2)
复杂对象
一般情况下,您可以考虑使用new
来避免使用非平凡创建的相当复杂的对象。你可以考虑一些增加多功能性的工厂/建筑商。
例如,如果您创建一个大型复合对象,最好使用构建器模式。 (Long example here)
简单对象
对于简单对象(最常见的情况),最好坚持new
。
例如,如果你有简单的类
public class Dog{
private string name;
//getter + setter
}
然后为此创建工厂是一种过度杀伤,您应该通过new Dog()
依赖注入
在企业应用程序中,您通常使用依赖注入,这样您就可以避免明确使用new
。您不会删除所有对象实例,但它提供了很好的改进。
(Basic Spring tutorial here)
答案 2 :(得分:1)
使用Class.forName时,可以在运行时设置类名。这对司机来说非常有用,例如
当您使用new时,您正在创建的实例的类名称是硬编码的。一般来说,这会产生很高coupling,应该避免(除非你绝对确定你总是需要这种耦合)。
简而言之,如果您想创建特定类的实例,new
不会造成任何伤害。
但是,你应该问问自己:
new
。)new
。答案 3 :(得分:1)
new
没有替代品,即使Class.forName("XYZ").newInstance()
HAS 与new
完全相同,唯一的区别在于您正在硬编码完整课程(甚至package...class
)因此实际上实现了您尝试做的相反,new
实例可以动态解析和/或甚至注入。
如果你注入一个interface A
的实例,你很可能会得到一个实现B
的类A
的bean - 这实际上更加动态,并且很好地补充了工厂模式。如果你的类名是硬编码的话,这几乎是不可能的,至少在我看来是这样。
答案 4 :(得分:-4)
如果您喜欢缓慢,缓慢的代码,这很难调试,维护和理解,绝对不惜一切代价避免使用new
关键字,尽可能地混淆!