在 Java 中创建对象时避免使用"新"Keword 的好处



我找到了一些博客,其中建议避免使用关键字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关键字,

尽可能混淆!

相关内容

  • 没有找到相关文章

最新更新