2015-04-27 24 views
5

Java en iyi uygulamaları, sabit okuma özelliklerini önerir. Peki, sizce ona ulaşmak için en iyi yaklaşım nedir? Benim yaklaşımım: Özellikler dosyasını sadece bir kez okuyabilmek için bir konfigürasyon sınıfı (singleton pattern) ve sabit olarak gerektiğinde özellikleri okumak için bu sınıfı kullanır. Ve saklamak için bir Sabitler sınıfı:Java sabitleri ve özellikleri

  • Özellikler dosyasında bunları bulmak için özellik adı (örneğin, app.database.url).
  • Statik sabitler (kullanıcının yapılandırma yapmasını istemediğim gibi, örneğin CONSTANT_URL = "myurl.com").
public final class Configurations { 

private Properties properties = null; 
private static Configurations instance = null; 

/** Private constructor */ 
private Configurations(){ 
    this.properties = new Properties(); 
    try{ 
     properties.load(Thread.currentThread().getContextClassLoader().getResourceAsStream(Constants.PATH_CONFFILE)); 
    }catch(Exception ex){ 
     ex.printStackTrace(); 
    } 
} 

/** Creates the instance is synchronized to avoid multithreads problems */ 
private synchronized static void createInstance() { 
    if (instance == null) { 
     instance = new Configurations(); 
    } 
} 

/** Get the properties instance. Uses singleton pattern */ 
public static Configurations getInstance(){ 
    // Uses singleton pattern to guarantee the creation of only one instance 
    if(instance == null) { 
     createInstance(); 
    } 
    return instance; 
} 

/** Get a property of the property file */ 
public String getProperty(String key){ 
    String result = null; 
    if(key !=null && !key.trim().isEmpty()){ 
     result = this.properties.getProperty(key); 
    } 
    return result; 
} 

/** Override the clone method to ensure the "unique instance" requeriment of this class */ 
public Object clone() throws CloneNotSupportedException { 
    throw new CloneNotSupportedException(); 
}} 

sabit Sınıf özellikleri ve sabitleri referanslar içerir.

public class Constants { 
// Properties (user configurable) 
public static final String DB_URL = "db.url"; 
public static final String DB_DRIVER = "db.driver"; 

// Constants (not user configurable) 
public static final String PATH_CONFFILE = "config/config.properties"; 
public static final int MYCONSTANT_ONE = 1; 
} 

Ve dosyaları özellikleri şöyle olacaktır:

db.url=www.myurl.com 
db.driver=mysql 

özelliklerini okumak için ve sabitler olacaktır:

// Constants 
int i = Constants.MYCONSTANT_ONE; 
// Properties 
String url = Configurations.getInstance().getProperty(Constants.DB_URL); 

Bu iyi bir yaklaşım olduğunu düşünüyor musunuz? Java'daki özellikleri ve sabitleri okuma yolunuz nedir?

Şimdiden teşekkürler.

cevap

2

iyi ben kod homojenize etmek daha iyi bir çözüm bulundu ve sabitler olarak her şeye sahiptir görünüyor. Aynı Configurations sınıfı ve .properties dosyası ile: getInstance() yöntemi durağan olduğundan, sabitler sınıf Sabitleri içinde başlatılabilir.

public class Properties { 
// Properties (user configurable) 
public static final String DB_URL = "db.url"; 
public static final String DB_DRIVER = "db.driver"; 
} 

Sonra Sabit sınıf olacak:

A sınıfı .properties dosyasında özelliğine adını depolamak için

public class Constants { 
// Properties (user configurable) 
public static final String DB_URL = Configurations.getInstance().getProperty(Properties.DB_URL); 
public static final String DB_DRIVER = Configurations.getInstance().getProperty(Properties.DB_DRIVER); 

// Constants (not user configurable) 
public static final String PATH_CONFFILE = "config/config.properties"; 
public static final int MYCONSTANT_ONE = 1; 
} 

Ve nihayet bunları kullanmak için:

// Constants 
int i = Constants.MYCONSTANT_ONE; 
// Properties 
String url = Constants.DB_URL; 

Testlerde sabitleri ve özellikleri sorunları gideren temiz ve zarif bir çözüm olduğunu düşünüyorum.

+2

Fabien'in de mümkün olan “getProperty” işlevini “getInstance” içine koyması ve bunu “getInstance(). GetProperty' adlı çağrıdan kaçınmak için yeni getProperty” olarak yeniden adlandırması gibi yorumladı. anlama. –

2

Apache Commons Configuration'a bir göz atmanız gerektiğini düşünüyorum, yararlı bulabilirdiniz. Yapılandırma dosyalarınız için bir hiyerarşiye sahip olmak gibi birçok şey yapabilirsiniz, birden çok kaynak belirtin.

Sabitleri için :)

+2

Bir şey değil. Size bu çözümü önerdim, çünkü bazen farklı desteklerden özellik almamızı sağlayan bir çözüme ihtiyacımız olduğunu biliyorum. Aksi takdirde benimsediğin çözüm de iyi görünüyordu. "GetProperty" yi "statik" olarak ayarlamış ve "getInstance" sözcüğünü dahil etmek için, özelliği almak için gereken yöntemde "getInstance" işlevini kullanmamak gerekir. – Fabien

+1

Cevabınız için teşekkürler, onun JNDI veya XML için güçlü bir kütüphane ama basit özellikleri dosyaları için benim düşünceme göre java.util sadeliği tercih edilir. Ayrıca, yeni kaynaklar ekleyerek ve [Properties.putAll] (http://docs.oracle.com/javase/7/docs/api/java/util/Hashtable.html#putAll (java.util) ile ekleyerek birden fazla kaynak eklemek de mümkündür .Map)) java.util.Properties'ten bu yana Harita uygulamaktadır. –