2013-12-09 3 views
3

в Java, я чтение из файла свойств в объект Properties:Как сделать объект доступным для другого объекта в глубине кода?

static Properties fileProp = null; // holds file properties 
    public static void main(final String[] args) throws IOException 
    { 
    ... 
    //load a properties file 
    InputStream is = LearnButtonPressHttpHandler.class.getResourceAsStream("/rsrc/file.properties"); 

    fileProp.load(is); 
    ... 

    // more objects are created 

    } 

позже, глубже в код, несколько слоев глубже, мне нужно, чтобы получить доступ к этому свойству объекта, но считает, что у меня нет доступ к этому объекту fileProp. Я не хочу передавать этот объект в качестве параметра по многим слоям туда, где он мне нужен. Это решило бы проблему, но, похоже, не было таким изящным решением. Есть ли способ лучше?

+0

Это отдельное приложение или вы используете это в каком-либо контексте сервера приложений или фреймворка? – amphibient

+0

на данный момент, он является автономным. – user840930

+0

Это кажется уместным: http://stackoverflow.com/questions/427902/what-is-the-best-approach-for-using-an-enum-as-a-singleton-in-java – hyde

ответ

1

Создать static поглотитель для fileProp справки:

public static Properties getFileProp() 
{ 
    return fileProp; 
} 

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

+0

Это действительно помогло! Благодаря! другие ответы также могли бы сработать, но это был тот, который работал на меня! – user840930

+0

В любое время. Некоторые из других ответов хороши с точки зрения стиля кодирования для удобства и дизайна. Мое решение быстро и легко, хорошо для небольшого проекта. –

0

Это одна из основных задач, которые делает инъекция зависимости. Например, весной существует PropertyPlaceholderConfigurer, который используется для ввода свойств из одного места в бобы по мере их создания (см. Prototype Pattern в Gang of Four).

Многие фреймворки просто выполняют управление статическими свойствами, например. Играть. Тогда вы в основном реализуете Singleton.

1

Простейший способ простой Java - использовать шаблон Singleton, загрузить ваши свойства singleton при запуске приложения или использовать метод getProperties в этом классе, который возвращает свойства, если они были загружены, и загружает их, если нет.

Например:

public class MySingleton { 
    private static MySingleton instance = null; 
    protected MySingleton() { 
     // Exists only to defeat instantiation. 
    } 
    public static MySingleton getInstance() { 
     if(instance == null) { 
     instance = new MySingleton(); 
     instance.loadData() 
     } 
     return instance; 
    } 

    private void loadData(){ 
     //doSomething 
    } 
} 

В этом случае, вы можете позвонить MySingleton.getInstance(), и получите искомый объект данных, который вы хотите, и не перезагрузить его, если он ранее был загружен. Если это первый раз, он будет загружать его лениво.

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

1

Создайте класс Singleton, который выполняет загрузку свойств (я предпочитаю Singleton, а не статический класс). Затем вы можете получить доступ к свойствам из любого места.

public class Singleton { 
    private static Singleton INSTANCE = null; 
    Properties props = new Properties(); 
    public static final Singleton getInstance() throws IOException { 
     if (INSTANCE == null) { 
      synchronized (Singleton.class) { 
       if (INSTANCE == null) { 
        INSTANCE = new Singleton(); 
        INSTANCE.loadProperties(); 
       } 
      } 
     } 
     return INSTANCE; 
    } 
    private void loadProperties() throws IOException{ 
      InputStream is = Singleton.class.getResourceAsStream("/rsrc/file.properties"); 
      props.load(is); 
    } 
    public Object getData(String key){ 
     return props.get(key); 
    } 
} 
Смежные вопросы