生成单身人士

Jam*_* P. 6 java singleton

这可能听起来像一个奇怪的想法,我还没有想到它.

假设您的应用程序最终需要一定数量的单例来执行某些I/O. 您可以编写一个单例并基本上根据需要多次重现代码.

然而,作为程序员,我们应该提出创造性的解决方案,避免任何形式的冗余或重复.什么是解决方案,使多个事情,每个可以作为一个单身人士.

PS:这是一个不能使用Spring等框架的项目.

Dom*_*ney 3

你可以引入这样的抽象:

public abstract class Singleton<T> {
  private T object;

  public synchronized T get() {
    if (object == null) {
      object = create();
    }
    return object;
  }

  protected abstract T create();
}
Run Code Online (Sandbox Code Playgroud)

然后对于每个单例,你只需要这样写:

public final Singleton<Database> database = new Singleton<Database>() {
  @Override
  protected Database create() {
    // connect to the database, return the Database instance
  }
};

public final Singleton<LogCluster> logs = new Singleton<LogCluster>() {
  ...
Run Code Online (Sandbox Code Playgroud)

然后你可以通过编写来使用单例database.get()。如果尚未创建单例,则会创建并初始化它。

人们可能不这样做的原因是,他们更喜欢重复写这样的东西:

private Database database;

public synchronized Database getDatabase() {
  if (database == null) {
    // connect to the database, assign the database field
  }
  return database;
}

private LogCluster logs;

public synchronized LogCluster getLogs() {
  ...
Run Code Online (Sandbox Code Playgroud)

是因为最终每个单例只需要多一行代码,并且初始化单例模式出错的可能性非常低。

  • 这太……可怕了。在构建单例期间连接数据库? (3认同)