【问题标题】:Java - What is the purpose of a "create" method that instantiates a new object? [duplicate]Java - 实例化新对象的“创建”方法的目的是什么? [复制]
【发布时间】:2017-11-16 01:45:21
【问题描述】:

我使用 Java 的大部分经验都是在课堂环境中编辑我自己的代码。我终于冒险进入破译他人密码的激动人心的世界,我想知道这一点:

public class MyClass {

    // Some fields here
    // A constructor there
    // Setters and getters abound

    public static MyClass create() {
        return new MyClass();
    }
}

我想知道这种方法的目的是什么。写MyClass foo = new MyClass(); 似乎并不比写MyClass foo = MyClass.create(); 更麻烦。这是我不知道的某种 Java 习语吗?完全没有必要吗?在构造函数带有任何参数的类中,它可能会更有用吗?有什么关系?

谢谢!

【问题讨论】:

  • 也许这段代码的作者不希望任何人显式调用他的构造函数。 create 方法让作者只公开他希望所有人看到的内容。这段代码中的构造函数是公有的还是私有的?
  • 它是一个公共构造函数
  • 那样的话也没用。

标签: java constructor


【解决方案1】:

这是一个非常有用的习惯用法,静态工厂方法。它可以完全控制新实例的创建,无论是不同的实例、缓存的实例等。只有将构造函数设置为私有时才有意义。

public class MyClass {

  private MyClass() {}

  public static MyClass create() {
      return new MyOtherClass();
  }

  private static class MyOtherClass extends MyClass {
    ...
  }
}

【讨论】:

  • 只有将构造函数设置为私有才有意义。你为什么这么说?
  • 如果没有,您无法完全控制实例创建,这是主要原因。
  • 并非如此。工厂方法可以提供额外的功能和清晰度,但这并不意味着您必须限制对构造函数的访问。例如,在 Joda 中两者都有是很常见的。
【解决方案2】:

静态工厂方法。

构造函数通常是私有的,这样新对象的创建可以通过一种方法来控制。

进一步阅读静态构建器类。

【讨论】:

    猜你喜欢
    • 2015-10-27
    • 2017-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-29
    相关资源
    最近更新 更多