Единственный экземпляр класса Java - PullRequest
3 голосов
/ 14 января 2010

Я хочу создать один экземпляр класса. Как я могу создать один экземпляр класса в Java?

Ответы [ 4 ]

18 голосов
/ 14 января 2010

Чтобы создать действительно единственный экземпляр вашего класса (подразумевающий одноэлементный на уровне JVM), вы должны сделать свой класс Java enum.

public enum MyClass {
  INSTANCE;

  // Methods go here
}

Шаблон синглтона использует статическое состояние и в результате обычно приводит к хаосу при модульном тестировании.

Это объясняется в пункте 3 «Эффективной Явы» Джошуа Блоха.

10 голосов
/ 14 января 2010

Очень простой синглтон.

public class Singleton {
  private static Singleton instance;

  static {
    instance = new Singleton();
  }

  private Singleton() { 
    // hidden constructor
  }    

  public static Singleton getInstance() {
    return instance;
  }
}

Вы также можете использовать ленивый шаблон держателя

public class Singleton {

  private Singleton() { 
    // hidden constructor
  }

  private static class Holder {
    static final Singleton INSTANCE = new Singleton();
  }

  public static Singleton getInstance() {
    return Holder.INSTANCE;
  }
}

Эта версия не будет создавать экземпляр синглтона, пока вы не получите доступ к getInstance (), но из-за способа, которым JVM / classloader обрабатывает создание во внутреннем классе, вы гарантированно вызовете конструктор только один раз.

5 голосов
/ 14 января 2010

использовать шаблон синглтона.

Синглтон

Обновление:

Что такое шаблон синглтона? Одноэлементный шаблон - это шаблон проекта, который используется для ограничения создания экземпляров класса одним объектом

1 голос
/ 23 января 2013
In Java, how can we have one instance of the BrokerPacket class in two threads? 

Чтобы все потоки обновлений хранили разные BrokerLocation в одном массиве местоположений. Например:

class BrokerLocation implements Serializable {
    public String  broker_host;
    public Integer broker_port;

    /* constructor */
    public BrokerLocation(String host, Integer port) {
        this.broker_host = host;
        this.broker_port = port;
    }
}


public class BrokerPacket implements Serializable {
    public static BrokerLocation locations[];   

} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...