2015-08-22 2 views
3

ТИП 1Java Константы стиль определение

public interface Constants{ 
    String FOO = "foo", 
      BAR = "bar", 
      ... ; 
} 

ТИП 2

public interface Constants{ 
    String FOO = "foo"; 
    String BAR = "bar"; 
    ... 
} 

Я использовал, чтобы объявить все константы в одном интерфейсе. Я придерживаюсь стиля 1, потому что это более читаемо. Мне интересно, есть ли разница между этими двумя стилями, отличными от читаемости. Есть ли связанные с производительностью вещи об этих двух стилях?

ПРИМЕЧАНИЕ: Я никогда не реализован интерфейс Constant, вместо этого я получить доступ те константы, как Constants.FOO.

пример:

public class Main{ 

    public static void main(String[] args){ 

     ... 
     System.out.println(Constants.FOO); 
     ... 

    } 

} 

Что лучше и почему?

+2

Не надо. Это анти-шаблон. https://en.wikipedia.org/wiki/Constant_interface – karakfa

+1

В общем случае используется тип enum или «private final static» в классе. – user1929959

+1

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

ответ

1

Сначала на месте объявите все константы в своем классе. Не группируйте их в один интерфейс, это плохой дизайн.

Мне интересно, есть ли разница между этими двумя стилями, отличными от читаемости.

Нет отличий, кроме удобочитаемости.

Есть ли связанные с производительностью вещи об этих двух стилях?

Нет. То же самое. Компиляция до одного и того же байтового кода.

Что лучше, и почему? ,

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

+0

, но суреш, константы используются в нескольких классах. и я никогда не реализовывал этот интерфейс, я использовал для вызова 'Constants.FOO'. это сейчас плохая практика? – theapache64

+1

Если интерфейс не предназначен для реализации, то зачем его использовать. Сделайте его окончательным классом с помощью частного конструктора. Ваш код будет работать так же хорошо, и никто не будет соблазн реализовать этот интерфейс, поскольку он не будет одним. Кроме того, группировка несвязанных констант в одном классе также является плохой практикой. Поместите константы в класс, где они принадлежат. Например, ограничения BorderLayout определены в BorderLayout. Целочисленное значение max и min определено в Integer. –

+1

Когда вы видите 'Constants.FOO', если' FOO' является статической константой, 'Constants' не обязательно является интерфейсом. –

2

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

Если вы не намерены реализовывать интерфейс констант, имеет смысл по меньшей мере разместить константы в классе final.

+0

Внутри интерфейса каждое поле неявно окончательно и статично. Но я согласен, что они не должны быть в интерфейсе в первую очередь. –

+0

Я думаю, что каждое поле в интерфейсе автоматически статично и окончательно. нет? – theapache64

+0

@JBNizet Спасибо за исправление. Я пропустил часть интерфейса ... – manouti

2

Вы не должны определять константы в interface вообще. It is bad practice. Вместо этого определите каждую константу в классе, где она логически уместна.

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

Редактировать: как отмечено в комментариях, константы интерфейса: static final по определению. Однако, когда они правильно определены там, где они должны быть, стоит отметить это как напоминание.

4

Я следую за стилем 1, потому что это более читаемо.

Рассмотрим следующий случай,

private static final String FOO1="foo1", FOO2="foo2", FOO3="foo3",BAR="bar"...//and so on 

Теперь это совсем не читается на самом деле, чем проверка ниже,

private static final String FOO1 ="foo1"; 
private static final String FOO2 ="foo2"; 
private static final String FOO3 ="foo3";//and so on 

Теперь рассмотрим readbility из приведенного выше кода,

constant FOO1 ="foo1"; 
constant FOO2 ="foo2"; 
constant FOO3 ="foo3";//and so on 

и

constant FOO1 = "foo1", FOO2 = "foo2", FOO3 = "foo3"; 

Во время чтения вторых вы можете упустить момент, что FOO3 также постоянно, а в первом случае это весьма заметно для тех, кто FOO3 постоянно. Более того, в обоих случаях нет разницы в памяти или исполнении.

Если вы специально создаете interface для констант, чем вы не используете interface, для чего он есть на Java. Интерфейс должен содержать какой-то контракт, по которому должен соответствовать класс реализации. Использование интерфейса для сохранения только константы неприятно.

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