java - 需要初始化对象时使用的设计模式?

标签 java c# oop design-patterns

我有一个类,它有一个 Initialize 方法,它在数据库中创建一堆表。这个类看起来像这样:

public class MyClass
{
  private bool initialized = false;

  public void Initialize()
  {
    if(!initialized)
    {
        //Install Database tables
        initialized = true;
    }
  }

  public void DoSomething()
  {
    //Some code which depends on the database tables being created 
  }

  public void DoSomethingElse()
  {
    //Some other code which depends on the database tables being created 
  }
} 

DoSomething 和 DoSomethingElse 这两个方法需要确保在继续之前调用了 Initialize 方法,因为它们依赖于数据库中的表。我有两个选择:

  1. 在类的构造函数中调用 Initialize 方法 - 这似乎不是一个好主意,因为构造函数现在应该调用方法,这些方法很重要,可能会导致异常。

  2. 在这两种方法中的每一种中调用 Initialize 方法 - 这似乎也不是一个很好的解决方案,尤其是在有多个方法的情况下。

是否有一种设计模式可以更优雅地解决这个问题?

最佳答案

我会使用 static factory method其中 Initialize 被调用,并将构造函数设为私有(private),以强制使用静态工厂方法:

public class MyClass
{
  private MyClass() { ... }

  public static MyClass createInstance() {
    MyClass instance = new MyClass();
    instance.Initialize();
    return instance;
  }
}

此外,我会删除 initialized 变量 - 部分原因是您不再需要它 - 但也因为它需要一些保证可见性的方法(例如同步、volatile 或 AtomicBoolean) 用于线程安全。

我认为 Miško Hevery's关于(不)在构造函数中工作的博客文章很有趣。

关于java - 需要初始化对象时使用的设计模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36843301/

相关文章:

java - 是否可以使用代号一将 eclipse 中的 android 应用程序转换为 ios Rim 窗口?

java - 如何仅使用Java在vaadin中创建Spring Security登录页面?

c# - 显示不带标签的显示名称属性的 Html 帮助程序

python - 标准化 Python 中的数据结构

python - 一个类和一个函数可以在 Python 中有一个共同的名字吗?

java - 如何将透明png设置为JButton?

java - 检查列表中的对象是否是最后一个(按日期)的最佳方法

c# - T 型通用接口(interface)以及其中

c# - .NET 控制台应用程序 (UTF-8) 中的越南字符

javascript oop私有(private)方法访问公共(public)属性