在Java中创建对象时避免“新”关键字的好处

时间:2014-12-19 11:54:37

标签: java oop instance instantiation object-create

我找到了一些博客,其中建议避免使用 new 关键字 创建一个类的对象。在没有 new 关键字的情况下创建对象的一些示例是 -

SampleObject obj = Class.forName("com.example.SampleObject").newInstance();

或使用clone()方法 -

SampleObject obj1 = new SampleObject();  
SampleObject obj2 = obj.clone();

然后here我找到了一些不使用 new 关键字创建对象的好例子

我能理解'工厂'模式,同时避免代码主要部分中的 new 关键字。如果我没有使用任何设计模式(用于创建对象),那么在没有 new 关键字的情况下创建对象有什么好处?或者在没有 new 的情况下创建对象的原因是什么?

5 个答案:

答案 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不会造成任何伤害。

但是,你应该问问自己:

答案 3 :(得分:1)

new没有替代品,即使Class.forName("XYZ").newInstance() HAS new完全相同,唯一的区别在于您正在硬编码完整课程(甚至package...class)因此实际上实现了您尝试做的相反new实例可以动态解析和/或甚至注入。

如果你注入一个interface A的实例,你很可能会得到一个实现B的类A的bean - 这实际上更加动态,并且很好地补充了工厂模式。如果你的类名是硬编码的话,这几乎是不可能的,至少在我看来是这样。

答案 4 :(得分:-4)

如果您喜欢缓慢,缓慢的代码,这很难调试,维护和理解,绝对不惜一切代价避免使用new关键字,尽可能地混淆!