5

这可能只是个人品味和工作流程的问题,但如果不止于此,我觉得无论如何我都应该问。

在 Java 中,通过构造函数创建实例和通过静态方法(返回实例)之间有什么区别?例如,从我正在处理的项目中获取这段代码(在发布时手工编写,因此采取了一些捷径和自由):

Plugin main;
Map<int, int> map;

public Handler(Plugin main) {
    this.main = main;
}

public static Handler init(Plugin main) {
    Handler handler = new Handler(main);
    handler.createMap();
}

public void createMap() {
    this.map = Maps.newHashMap();
}

在这种情况下,使用之间有什么区别

Handler handler = new Handler(this);

Handler handler = Handler.init(this);

在 Plugin 类中,除了createMap()只在后者中运行,因为它没有在构造函数中调用?

为了澄清,在这种情况下,Plugin被认为是主类。

我知道足够多的 Java 语法来编写中级插件,但对 Java 本身还不够了解,无法知道这两种方式之间的区别。

编辑:例如,Maps我用来创建的类Map使用静态工厂方法(我希望我正确使用该术语)使用类而不是对象调用。

4

2 回答 2

7

静态工厂方法既有优点也有缺点。

好处

  • 描述性的、有意义的名称。
  • 当被调用时,他们可以决定是否返回一个新实例
  • 它们可以返回返回类型的任何子类型的对象
  • 它们减少了创建参数化类型实例的冗长性

缺点

  • 如果只提供静态工厂方法,则不能对没有公共或受保护构造函数的类进行子类化
  • 它们不容易与其他静态方法区分开来

资料来源:Effective Java,第二版。

于 2013-02-27T01:54:43.047 回答
6

不同的是静态工厂方法更灵活。它可以有各种方式来返回一个实例。它可以做其他方面的事情。它可以有一个更具描述性的名称。它可以foo(args)通过静态导入或继承通过其简单名称(例如)调用。

构造函数调用更加确定——调用者确切地知道发生了什么——创建了该确切类的新实例。

于 2013-02-27T01:14:27.077 回答