2013-04-14 2 views
1

Я хочу создать одноэлементный класс Phone, так что он может быть инициализирован (с номером), а также одновременно совместим. Итак, вот что я пришел с:Однопользовательский однопользовательский режим с параметром инициализации в java

import java.io.BufferedReader; 
import java.io.File; 
import java.io.FileReader; 
import java.io.IOException; 


public class PhoneTest { 
    public static void main(String... args){ 
     System.out.println(Phone.getInstance().getNumber()); 
    } 

    static final class Phone { 
     private final String number; 
     private final static Phone instance; 
     static { 
      instance = new Phone(PhonePropertyReader.readPhoneNumber()); 
     } 

     private Phone(String number) { 
      this.number = number; 
     } 

     public static Phone getInstance() { 
      if (instance == null) throw 
       new IllegalStateException("instance was not initialized"); 
      return instance; 
     } 

     public String getNumber() { 
      return number; 
     } 
    } 


    static final class PhonePropertyReader { 
     static String readPhoneNumber() { 
      File file = new File("phone.properties"); 
      String phone = ""; 
      System.out.println(file.getAbsolutePath()); 
      if (!file.exists()) { 
       return phone = "555-0-101"; 
      } 

      try { 
       BufferedReader r = new BufferedReader(new FileReader(file)); 
       phone = r.readLine().split("=")[1].trim(); 
       r.close(); 
      } catch (IOException e) { 

      } 
      return phone; 
     } 
    } 
} 

также у меня есть файл phone.properties, содержащие

phone=12345 

ли это хорошее решение? Является ли он одновременно безопасным?

+1

Выглядит хорошо. Вы можете [прочитать это] (http://blog.crazybob.org/2007/01/lazy-loading-singletons.html) и сделать свой синглтон ленивым. –

+0

так должно быть что-то вроде этого: http://pastebin.com/sZAAMRur? то я думаю, что PhoneHolder будет загружен точно в то же время, что и телефон, загрузив телефон, таким образом, загрузка телефона в этом примере произойдет одновременно с моим исходным кодом. Я прав? – dhblah

+0

Да, вы правы. Вы, например, хорошо выглядите. За исключением пустого 'catch' на строке 50 - я бы предложил вам бросить [' ExceptionInInitializerError'] (http://docs.oracle.com/javase/6/docs/api/java/lang/ExceptionInInitializerError.html). –

ответ

1

Я считаю, что Enum по-прежнему является лучшим способом реализации потокобезопасных синглетонов в java.

+0

Итак, вот как это должно выглядеть с перечислением: http://pastebin.com/By6PkhWn правильно? – dhblah

+0

Да, для получения дополнительной информации читайте об [enums] (http://docs.oracle.com/javase/tutorial/java/javaOO/enum.html) в учебнике по java. – tarrsalah

0

я бы отговорить вас использовать одиночка (Check this other question)

В противном случае, ваш код потокобезопасен, так как только притворство вы делаете в static {} области, которая, по определению, поточно.

Btw, почему бы не включить свой метод readPhoneNumber() непосредственно в ваш класс phone?

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