当前位置: 首页 > 知识库问答 >
问题:

这个onCreate()方法是否总是在Foo()构造函数之后运行?

吉玉宸
2023-03-14

我认为这段代码是错误的,因为jvm可以选择在完成构造函数之前运行onCreate()

那么,当Foo()构造函数完成时,如何确保另一个线程始终执行onCreate()

public class Foo{
    public Foo(){
        synchronized (this) {
            new Thread(() -> {
                synchronized (Foo.this) {
                    onCreate();
                }
            }).start();
        }
    }

    protected void onCreate(){

    }
}

共有1个答案

云承天
2023-03-14

使用静态工厂方法:

public class Foo {
  // Private constructor forces instances to be created using factory method.
  private Foo() {}

  protected void onCreate() {}

  static Foo newInstance() {
    Foo foo = new Foo();
    new Thread(foo::onCreate).start();
    return foo;
  }
}
 类似资料:
  • 我很难确定这到底是什么。此时,我已经熟悉了方法、构造函数和类声明的样子。这是哪个?为什么它看起来像一个构造函数和一个方法有一个婴儿?

  • 问题内容: 我的第一个问题是- 构造函数应始终声明为公共吗? 如果我创建一个构造函数该怎么办。 我总是看到构造函数是隐式的。那么为什么构造函数有用呢?还是根本没有用。因为没有人可以调用它,或者永远也不能创建对象(由于构造函数)!这是我的第二个问题。 问题答案: 不, 构造函数 可以是,, 或(根本没有访问修饰符)。 做某事 并不意味着没有人可以访问它。这只是意味着该类之外的任何人都不能访问它。因此

  • 问题内容: 假设我有一个Java类 而且我知道每个派生类构造后都必须调用。我当然可以在派生类的构造函数中简单地调用它: 但这严重破坏了“不要重复自己”的原则(并且将有的许多子类)。当然,该调用不能进入构造函数,因为它执行得太早了。 任何想法如何绕过这个问题?我也很高兴看到Scala解决方案。 更新:这是工厂方法的通用版本: 更新2:这个问题基本上是“如何为构造函数使用模板方法”?答案似乎是,“可以

  • 问题内容: 我在下面的代码中担心的是,构造函数的参数实际上并未直接映射到类的实例字段。实例字段从参数获取值,而我正在使用initalize方法。此外,我做了一些工作,以便可以在随后的代码中直接使用创建的对象,例如,调用drawBoundaries()。我感觉它在做抽象意义上的创建(初始化)画布的意思。 我的构造函数做得太多吗?如果我添加方法从外部显式调用构造函数中的内容,那将是错误的。请让我知道您

  • 我有一个打字稿2类,目标是ES5。当我运行它时,我在控制台的主题行中得到了错误。Switch语句工作正常,但增量()和减量()方法不执行。

  • 问题内容: 谁能解释以下程序的输出?我认为构造函数要在实例变量之前初始化。因此,我期望输出为“ XZYY”。 问题答案: 正确的初始化顺序是: 如果该类先前尚未初始化,则按文本顺序的静态变量初始化程序和静态初始化块。 构造函数中的super()调用,无论是显式的还是隐式的。 实例变量初始化程序和实例初始化块,按文本顺序。 super()之后构造函数的其余主体。