5

我发现了一些博客,其中建议new在创建类的对象时避免使用关键字。new创建没有关键字的对象的一些示例是-

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

或使用clone()方法 -

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

然后在这里我找到了一些创建没有new关键字的对象的好例子

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

4

5 回答 5

8

您在博客中阅读的内容一定是关于工厂方法和类似技术的,它们并没有避免 new,而是将其置于更灵活的 API 之后。

运营商绝对没有总体不利因素new。它已经并将继续是任何 Java 代码的主要内容,也是实际创建对象的最自然方式,而不是满足更一般的关注点,例如“为我提供 API 的入口点”。

所有其他不涉及创建对象的技术new都是专用工具(克隆、反序列化等)。

于 2014-12-19T12:23:10.330 回答
2

复杂对象

一般来说,您可以考虑避免new使用非平凡创建的相当复杂的对象。您可以考虑一些增加多功能性的工厂/制造商。

例如,如果您创建一个大型复合对象,最好使用构建器模式。(这里很长的例子

简单对象

对于简单的对象(最常见的情况),最好坚持使用new.

例如,如果您有简单的课程

public class Dog{
    private string name;

    //getter + setter
}

然后为此创建工厂是一种矫枉过正的做法,您应该通过以下方式调用它new Dog()

依赖注入

在企业应用程序中,您通常使用依赖注入,这可以让您避免new显式使用。您不会删除所有对象实例化,但它提供了很好的改进。(基本 Spring 教程在这里

于 2014-12-19T11:58:14.567 回答
1

使用 Class.forName 时,可以在运行时设置类名。这对司机很有用,例如

相反,当您使用 new 时,您正在创建的实例的类名是硬编码的。一般来说,这会产生高耦合,应该避免(除非你绝对确定你总是需要这种耦合)。

简而言之,如果你想创建一个特定类的实例new没有坏处。

但是,您应该问自己:

  • 如果你真的需要一个新实例(否则,你应该用new或池替换)。
  • 如果您将始终为该实例使用相同的类(否则,您应该替换newDependency InjectionFactory Pattern)。
于 2014-12-19T11:56:58.090 回答
1

没有替代品new,甚至必须完全一样地工作Class.forName("XYZ").newInstance() new唯一的区别是您正在硬编码整个类(甚至是package...class),因此实际上实现了与您尝试做的相反new的事情,实例可以动态解决和/或什至注射。

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

于 2014-12-19T12:39:16.907 回答
-4

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

于 2014-12-19T12:06:20.090 回答