Каково использование интерфейсных констант?

Я изучаю Java и просто нашел, что Интерфейс может иметь поля, которые являются общедоступными помехами и окончательный. Я не видел примеров их до сих пор. Что такое некоторые варианты использования этих Интерфейсных Констант, и я могу видеть некоторых в Библиотеке Стандарта Java?

114
задан unj2 17 April 2010 в 19:00
поделиться

4 ответа

Включение статических элементов в интерфейс (и реализация этого интерфейса) является плохой практикой , и для этого даже есть название, Антипаттерн констант интерфейса , см. Effective Java , пункт 17:

Шаблон постоянного интерфейса - это плохое использование интерфейсов . То, что класс использует некоторые константы внутри, является деталью реализации. Реализация постоянного интерфейса приводит к тому, что эта деталь реализации просачивается в экспортируемый API класса. Для пользователей класса не имеет значения, что класс реализует постоянный интерфейс. На самом деле, это может даже сбить их с толку. Хуже того, это представляет собой обязательство: если в будущем выпуске класс будет изменен так, что ему больше не нужно будет использовать константы, он все равно должен реализовать интерфейс, чтобы гарантировать двоичную совместимость. Если нефинальный класс реализует постоянный интерфейс, пространство имен всех его подклассов будет загрязнено константами в интерфейсе.

В библиотеках платформы Java есть несколько постоянных интерфейсов, например java.io.ObjectStreamConstants . Эти интерфейсы следует рассматривать как аномалии, и не следует имитировать.

Чтобы избежать некоторых ошибок постоянного интерфейса (потому что вы не можете помешать людям его реализовать), следует предпочесть правильный класс с частным конструктором (пример заимствован из Википедии ):

public final class Constants {

    private Constants() {
        // restrict instantiation
    }

    public static final double PI = 3.14159;
    public static final double PLANCK_CONSTANT = 6.62606896e-34;
}

И для доступа к константам без необходимости их полной квалификации (т.е.без префикса имени класса) используйте статический импорт (начиная с Java 5):

import static Constants.PLANCK_CONSTANT;
import static Constants.PI;

public class Calculations {

    public double getReducedPlanckConstant() {
        return PLANCK_CONSTANT / (2 * PI);
    }
}
176
ответ дан 24 November 2019 в 02:34
поделиться

Джошуа Блох, «Эффективное руководство по языку программирования Java»:

Постоянный шаблон интерфейса - это плохое использование интерфейсов. То, что класс использует некоторые константы внутри, является деталью реализации. Реализация константного интерфейса приводит к тому, что эта деталь реализации просачивается в экспортируемый API класса. Для пользователей класса не имеет значения, что класс реализует постоянный интерфейс. На самом деле это может даже сбить их с толку. Хуже того, это представляет собой обязательство: если в будущем выпуске класс будет изменен так, что ему больше не потребуется для использования констант, он все равно должен реализовать интерфейс, чтобы гарантировать двоичная совместимость. Если нефинальный класс реализует интерфейс с константой , пространство имен всех его подклассов будет загрязнено константами в интерфейсе.

6
ответ дан 24 November 2019 в 02:34
поделиться

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

Вот пример: http://www.javapractices.com/topic/TopicAction.do?Id=32

Но обратите внимание, что рекомендуется использовать статический импорт вместо константы в интерфейсах. Вот ссылка: http://www.javapractices.com/topic/TopicAction.do?Id=195

3
ответ дан 24 November 2019 в 02:34
поделиться

Интерфейс javax.swing.SwingConstants является примером, который получил статические поля, которые используются среди классов свинга. Это позволяет вам легко использовать что-то вроде

  • this.add (LINE_START, swingcomponent);
  • this.add (this.LINE_START, swingcomponent); или
  • this.add (SwingComponents.LINE_START, swingcomponent );

Однако в этом интерфейсе нет методов ...

1
ответ дан 24 November 2019 в 02:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: