当前位置: 首页 > 面试题库 >

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

顾乐家
2023-03-14
问题内容

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

在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);

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

在这种情况下,要澄清的Plugin是主要类别。

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

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


问题答案:

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

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



 类似资料:
  • 问题内容: 如标题所示,两者之间到底有什么区别 和 除了结构以外,还有什么重要区别吗? 问题答案: 对于您的示例,没有区别。但是如您所见, 只能接受一个表达式来初始化变量。但是,在静态初始化器(JLS 8.7)中,可以执行任意数量的语句。例如,可以这样做: 对于您的示例,显然不需要这样做,但是变量的初始化可能不仅仅使用表达式,甚至可能包含许多语句,因此Java制作了静态初始化器。

  • 问题内容: 什么时候应该使用构造函数,什么时候应该使用静态方法? 您能用小片段解释一下吗?我略读了一些线程,但是我仍然不清楚。 问题答案: 当您只想返回该类型的新对象并且希望简单时,请使用公共构造函数。 一个很好的例子是StringBuilder,因为它是可变的,您可能每次都想要一个新对象。 当您可能想重用对象(尤其是不可变的对象),返回子类或描述结构时,请使用静态因子方法。一个很好的例子是Enu

  • 我有一个单例类(所以私有构造函数),它需要在初始化期间使用Spring数据存储库。我有一个注入作为构造函数参数。大致: 我想单元测试我的类,所以我需要用模拟值初始化一个模拟存储库,然后在我的类初始化之前传递到我的类中。我如何写我的Mockito模拟在我的JUnit测试使这成为可能?

  • 映射对构造函数没有限制或要求 (__init__ )类的方法。您可以自由地为您想要的函数要求任何参数,为ORM未知的实例分配属性,并且通常在编写Python类的构造函数时做您通常会做的任何其他事情。 sqlAlchemy ORM不调用 __init__ 从数据库行重新创建对象时。ORM的过程有点类似于Python标准库的 pickle 模块,调用低级 __new__ 方法,然后在实例上悄悄地恢复属

  • 问题内容: Python中是否有诸如静态构造函数之类的东西? 如何在Python中实现静态构造函数? 这是我的代码…当我这样调用App时不会触发。该不是静态构造函数或静态初始化。 我必须这样称呼它,它每次都会实例化App类: 这是我的课: 每次调用的问题是重新创建了App对象。我的“真实” App类很长。 问题答案: 提示:任何引用都将需要实例化该类。您可以这样做: 但是,来吧,这似乎有很多不足。

  • 问题内容: 我有2节课: Class A: Class B: I create a Main class which just creates new A: The output I get is: 如您所见,A的构造函数在其静态初始值设定项之前被调用。 我了解它与我创建的循环依赖关系有关,但我印象中静态初始化程序应始终在构造函数之前运行。 发生这种情况的原因是什么(技术上在Java实现中)? 是