Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:构造函数初始化和静态方法初始化的区别?_Java_Methods_Constructor_Workflow_Bukkit - Fatal编程技术网

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

Java:构造函数初始化和静态方法初始化的区别?,java,methods,constructor,workflow,bukkit,Java,Methods,Constructor,Workflow,Bukkit,这可能只是个人品味和工作流程的问题,但如果不止这些,我觉得我还是应该问 在Java中,通过构造函数创建实例和通过静态方法(返回实例)创建实例有什么区别?例如,从我正在从事的一个项目中获取这段代码(在发布时手工编写,因此采用了一些快捷方式和自由): 及 在Plugin类中,除了createMap()只在后者中运行,因为它没有在构造函数中调用之外 为了澄清,在这种情况下,Plugin被认为是主类 我对Java语法的了解足以编写中级插件,但对Java本身的了解还不足以了解这两种方法之间的区别 编辑:例

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


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

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

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

我对Java语法的了解足以编写中级插件,但对Java本身的了解还不足以了解这两种方法之间的区别


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

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


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

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

优势

  • 描述性、有意义的名称
  • 调用时,它们可以决定是否返回新实例
  • 它们可以返回返回类型的任何子类型的对象
  • 它们减少了创建参数化类型实例的繁琐性
缺点

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

资料来源:有效Java,第二版。

对不起;所以在我打字之前就贴出来了!一定是无意中碰到了Tab,直到我尝试按Enter键插入新行时才意识到这一点。但我很高兴人们能够在我完成输入之前阅读并回复它,尽管当时提供的信息几乎是零B-“发布时手写的”-您可以随时在“语法突出显示”中测试代码示例如果编辑器不坚持用制表符缩进的话,那么它一开始就可以创建这些标签。)@millimoose-True。虽然我的意思更像是“如果我不小心没能表达我的意思,那是因为我把它写在了我的头上”。但是对于建议+1:)+1。我想补充一点,静态工厂方法可以返回不同具体类的实例,这在某些情况下非常有用。这就是我想要的答案。Nishant的回答确实有用且信息丰富,但我更多的是寻找差异,而不是优势/劣势。无论哪种方式,两者都有帮助。:)谢谢#4的优势在Java7中不再存在,Java7引入了菱形推理来解决这个问题。
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);