Java:通过构造函数初始化和通过静态方法初始化之间的区别?

标签 java methods constructor workflow bukkit

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

在 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 本身的了解还不够了解这两种实现方式之间的区别。

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

最佳答案

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

优势

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

缺点

  • 如果只提供静态工厂方法,则没有公共(public)或 protected 构造函数的类不能被子类化
  • 它们不容易与其他静态方法区分开来

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

关于Java:通过构造函数初始化和通过静态方法初始化之间的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15102384/

相关文章:

java - 用于 Hibernate 和 Oracle 的 ID 生成器 (Spring MVC)

Java解析大型XML文档

objective-c - Objective-C 类的方法存储在哪里以及如何存储?

c++ - 返回值部分且确定性地变化

C++11: string(50, 'x' ) 与 string{50, 'x' }

java - 在 JMS 队列上发布消息?

java - java或c中的按位运算

c++ - C++中的方法和成员有什么区别?

ruby - 带有可选参数的方法

c# - 无参数构造函数