2014-02-03 3 views
0

Есть ли одноэлементный дизайн, который может полностью предотвратить создание более чем одного объекта?Можем ли мы создать по-настоящему одноэлементный класс в java?

Задавая этот вопрос, имея в виду, что в Java мы можем воссоздать «одноэлементные объекты», используя сериализацию-десериализацию и отражение.

+2

Перед этим вы можете определить «по-настоящему»? –

+0

Под «действительно» я имел в виду, что в области приложения может быть создан один экземпляр. –

ответ

2

Да, Java 5 введены перечислений, которые устойчивы к наличию дополнительных экземпляров, созданных с помощью сериализации и т.д.

Стандартный способ создать синглтон в Java 5+, чтобы использовать один-постоянное перечисление.

+0

с различными загрузчиками классов вы все равно можете создать более одного ... – assylias

+0

@assylias С разными загрузчиками классов вы говорите о разных классах (с точки зрения JVM), поэтому он все еще одноточечный --- для данный класс. –

0

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

Сериализуемого одноточечно

public enum Elvis { 
     INSTANCE; 
     private final String[] favoriteSongs = 
      { "ABC", "DEF" }; 
     public void printFavorites() { 
      System.out.println(Arrays.toString(favoriteSongs)); 
     } 
    } 
1

Возможно, да или нет, в зависимости от того, какие шаги вы делаете и какие случаи вы имеете в виду.

Чисто в рамках JVM, я бы сказал, нет. Ресурсы, загружаемые разными загрузчиками классов, считаются отличными. Поэтому, независимо от того, какие проверки вы установили, ваш единственный файл Foo.class может быть загружен разными загрузчиками классов, и будут созданы два экземпляра вашего статического объекта. Статические переменные, на которые они ссылались, были бы разными, поэтому один из них не мог видеть, что другой уже был создан.

Однако, если вы хотите использовать внешние ресурсы (например, файл в локальной файловой системе, если вы определенно можете записать в каталог), тогда это может быть возможно. Это предполагает, что внешняя система имеет семантику сравнения и настройки или другую синхронизацию, иначе у вас есть потенциальное состояние гонки, которое может привести к тому, что другие потенциальные экземпляры видят, что другой не работает, а затем запускается.

Последний случай может иметь значение в зависимости от того, почему вы так уверены, что второй экземпляр не может существовать. Если это связано с тем, что это может привести к повреждению какого-либо внешнего ресурса, установите ограничение на этот ресурс.

3

Да, мы можем разработать действительно одноэлементный класс (который также является потокобезопасным).
Но каждый одноэлементный класс является только одноточечным в пределах данного загрузчика классов,
не во всей JVM во время выполнения.

Для получения дополнительной информации, проверьте эти связанные вопросы.

What is an efficient way to implement a singleton pattern in Java?

How does Singleton behave when two threads call the "getInstance()" at the same time?

How to correctly make a thread safe Singleton Factory in Java?

0

Тип перечисления Одноэлементная является лучшим способом реализовать синглтон.

Он предоставит бесплатную сериализующую технику и предоставит гарантию на бронзу против нескольких экземпляров, даже перед сложными сериализацией или отражением.

0

Да, вы можете сделать по-настоящему одноэлементный класс в java.

Для примера:

public class Foo { 

private Foo f = null; 
//More Variables 

private Foo(){ //Constructor 
} 

public static Foo getInstance() { 
if (f == null) { //f is the instance of the class Foo. 
f = new Foo(); 
} 
return f; 
} 

public void display() { 
System.out.println("Display"); 
} 

//...More Methods 
} 

In order to call, you may use it as: 
Foo.getInstance().display(); 

И каждый раз, вы называете деЫпзЬапсе(), он будет только один экземпляр класса Foo один раз в течение жизни приложения.

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