2010-01-14 9 views
3

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

+6

'new MyClass()' выполнен один раз? –

+2

OT - цитата из более раннего вопроса: «Я очень familier с языком программирования Java» - girinie, честно говоря, я не ожидал этого вопроса - вы * должны * улучшить свои навыки Java, прежде чем атаковать свой проект интернет-магазина (http: //stackoverflow.com/questions/2055016/web-site-design-idea-closed)! По крайней мере, вы должны знать (мастер?) Шаблоны GoF. –

ответ

17

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

public enum MyClass { 
    INSTANCE; 

    // Methods go here 
} 

Одноэлементный шаблон использует статическое состояние и, как результат, обычно приводит к хаосу при модульном тестировании.

Это объясняется в пункте 3 Эффективной Java Joshua Bloch.

+0

Чтобы быть точным, синглтон будет только на уровне класса загрузчика, вы должны управлять всеми загрузчиками классов в JVM, чтобы иметь возможность гарантировать синглтон на уровне JVM. – pgras

+0

Думаю, вы обнаружите, что это злоупотребление тем, что предназначено для перечисления. Перечисление относится к нескольким связанным элементам (например, дням недели), так что вы можете иметь безопасный способ выполнения переключателей/сравнений и т. Д. Они не относятся к одному экземпляру класса. Синглтоны усложняются с различными структурами загрузчика классов, но это происходит независимо от того, как вы его реализуете. – Shane

+0

@Shane, см. Эффективная Java. Переменные Java намного больше, чем простые перечисления, доступные на других языках. – gpampara

5

используйте одноэлементный узор.

Singleton pattern

Update:

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

+1

-1 очевидно .. но он не знал, КАК – lexu

+1

Вот почему я добавил ссылку. Нет смысла повторять ту же информацию здесь. –

+0

не видел ссылку, ваше редактирование и мой комментарий, должно быть, были асинхронными. Я удалил -1 – lexu

10

Очень простой одноплодным.

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/загрузчик классов обрабатывает создание во внутреннем классе, вам гарантированно будет иметь только один конструктор.

+1

Объяснение: Я не думаю, что невозможно ограничить выполнение конструктора. Решение состоит в следующем: сделать конструктор закрытым - чтобы никто не вызывал его извне. Используйте статическую функцию для инициализации единственного экземпляра объекта - если он равен NULL, затем вызовите конструктор изнутри. – effkay

+0

Единственное улучшение, которое я сделал бы для этого, - это ленивая инициализация синглтона. –

+1

Почему статический блок? Вы можете просто запустить экземпляр в той же строке, где вы его объявите. @Taylor L Вы не обязательно всегда хотите ленивый init, который зависит от остальной части приложения и его требований к загрузке. –

1
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[]; 

} 
Смежные вопросы