2013-09-04 3 views
0

У меня есть класс со всей конфигурацией из файла свойств.Статические конечные переменные элемента и методы get

Мой первый решение заключается в следующем:

public class Config { 

    public static final int disc; 

    static { 

     // Read property file and set properties 

     disc = 5; 
    } 
} 

Читая информацию таким образом:

System.out.println(Config.disc); 

Второе решение:

public class Config { 

    private int disc; 

    public void Config() { 

     // Read property file and set properties 

     disc = 5; 
    } 

    public int getDisc() { 
     return this.disc; 
    } 
} 

Чтение таким образом:

System.out.println(new Config().getDisc()); 

Каков наилучший способ и почему? Какие преимущества и недостатки?

+2

Ваше первое решение не компилируется. – Jesper

+0

Скорее всего, вы пытаетесь создать [Singleton] (http://en.wikipedia.org/wiki/Singleton_pattern) (в этом случае Singleton будет лучшим способом). – Dukeling

+0

Пожалуйста, повторите проверку кода перед отправкой в ​​следующий раз. –

ответ

1

с использованием getDisc() вы можете иметь одну переменную диска на объект, а static disc - общий доступ ко всем экземплярам.

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

По они путь, вы не можете сделать System.out.println(Config.getDisc());. Вы не можете вызвать нестатический метод, используя имя класса

1

О нас: public static final int DISC = 5; Затем вы можете использовать Config.DISC для доступа к вашему значению конфигурации.

1
System.out.println(Config.getDisc()); 

Это неверно. Вы не можете вызвать нестатический метод с именем класса. Вы должны создать объект следующим образом:

Config cfg = new Config(); 
System.out.println(cfg.getDisc()); 

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

2

Ответ зависит от значения disc:

  • Если disc представляет собой константу, по существу, давая имя в числовое значение, чем общественное конечное поле лучше
  • Если disc представляет собой значение, может измениться в результате действий пользователя (т. е. если это часть конфигурации), предпочтительна личная переменная с геттером.

Второй подход дает больше гибкости, если вы решили реорганизовать свой класс в будущем: она позволяет инициализировать частный disc в более позднее время, или заменить его каким-либо другим способом получения значения, например, путем вычисления его из других значений или чтения из другого объекта.

0

Принципы разработки программного обеспечения требуют «Информация Скрытие».В вашем первом решении ваше свойство «disc» является общедоступным, и это свойство можно использовать в любом месте, и оно нарушает принцип «скрытия информации». Я голосую за ваше второе решение и рекомендую вам сделать «диск» приватным.

0

Что вы хотите в этом случае действительно

public static final int DISC = 5; 

System.out.println(Config.DISC); 

(Обратите внимание, что члены, как это обычно всегда записывается в capticals).


Ваше первое решение есть ошибка в нем. Он не будет компилироваться, потому что вы пытаетесь установить конечное поле несколько раз. Каждый раз, когда вы создаете new Config(), вы назначаете значение disc, но поскольку оно окончательное, это не сработает. То, что вы, вероятно, хотел бы предложить было поставить его в статическом конструкторе:

public class Config 
{ 
    public static final int DISC; 
    static 
    { 
     DISC = 5; 
    } 
} 

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

У вашего второе решение имеет ошибку. Он не будет компилироваться, потому что вы не можете получить доступ к нестационарному методу из статического контекста. Это означает, что вам сначала нужно создать экземпляр Config, прежде чем вы сможете вызвать метод getDisc(). Лучшее решение в этом случае - объявить метод статическим.

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