Jump to content

Постоянный интерфейс

В языке программирования Java шаблон интерфейса констант классы описывает использование интерфейса исключительно для определения констант, а реализуют этот интерфейс для достижения удобного синтаксического доступа к этим константам. Однако, поскольку константы очень часто являются просто деталями реализации, а интерфейсы, реализованные классом, являются частью его экспортируемого API, такая практика сводится к помещению деталей реализации в API, что считалось неуместным, например, Java-дизайнер Джошуа Блох . [ 1 ] В общем, сбор системных констант в классы, независимые от поведения, может привести к плохому объектно-ориентированному проектированию, поскольку часто является признаком низкой связности . По этим причинам константные интерфейсы можно считать антишаблоном .

Использование этого шаблона имеет и другие недостатки: [ оригинальное исследование? ]

  1. класса Он загрязняет пространство имен переменными, доступными только для чтения, которые могут оказаться бесполезными.
  2. В отличие от во время компиляции тактической полезности реализации постоянного интерфейса , случайные артефакты времени выполнения не имеют практической пользы (ср. интерфейсы-маркеры , которые также не имеют методов, но полезны во время выполнения).
  3. Если в будущих выпусках потребуется совместимость двоичного кода , постоянный интерфейс должен навсегда оставаться интерфейсом (он не может быть преобразован в класс), даже если он не использовался в качестве интерфейса в обычном смысле.
  4. Без IDE, которая определяет, откуда взялась константа, отслеживание ее обратного класса или интерфейса может занять много времени.
  5. Экземпляр интерфейса синтаксически не более полезен, чем само имя интерфейса (поскольку у него нет методов).
  6. Если разработчик не проверяет какие-либо реализованные интерфейсы при добавлении константы в класс или не делает это, но делает опечатку в имени добавленной константы, значение константы может быть изменено автоматически. Рассмотрим пример 2 ниже.

Обратите внимание, что библиотеки Java сами используют постоянный шаблон интерфейса. Например, интерфейс SwingConstants [ 2 ] был выпущен в 1998 году, [ 3 ] и тогда это был разумный выбор.

public interface Constants {

	double PI = 3.14159;
	double PLANCK_CONSTANT = 6.62606896e-34;
}

public class Calculations implements Constants {

	public double getReducedPlanckConstant() {
		return PLANCK_CONSTANT / (2 * PI);
	}
}
public interface Constants {

	public static final int	CONSTANT = 1;
}

public class Class1 implements Constants {

	public static final int CONSTANT = 2;	// *

	public static void main(String args[]) throws Exception {
		System.out.println(CONSTANT);
	}
}

Перед добавлением строки, отмеченной звездочкой, при запуске Class1 печатается 1. После добавления строки Class1 печатается 2. Обе версии компилируются без предупреждений и ошибок.

Альтернативы

[ редактировать ]

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

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 , можно использовать статический импорт. [ 4 ] чтобы иметь возможность использовать константы без квалификатора Constants:

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

public class Calculations {

	public double getReducedPlanckConstant() {
		return PLANCK_CONSTANT / (2 * PI);
	}
}

Константы также можно импортировать в массовом порядке с помощью оператора import static Constants.* . Это достигает тех же целей, что и использование интерфейса, позволяя ссылаться на константы без квалификатора.

В той или иной степени перечисленные выше проблемы в настоящее время решены:

  1. Поскольку статические члены можно импортировать специально, пространство имен класса не нужно засорять всеми членами константного интерфейса.
  2. Семантика времени выполнения и компиляции более тесно согласована при использовании статического импорта вместо постоянных интерфейсов.
  3. Скомпилированный код имеет на одно ограничение двоичной совместимости меньше (что «вычисления класса реализуют константы»).
  4. Поскольку статический импорт применяется только к текущему файлу (а не ко всей иерархии классов), легче обнаружить, где объявлен каждый статический член.
  5. Меньше необходимости объявлять переменные постоянного типа интерфейса, и потенциально яснее, что конкретного экземпляра на самом деле не существует.

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

  1. ^ Блох, Джошуа, Эффективная Java, 2-е издание, стр. 98
  2. ^ "Константы Swing"
  3. ^ Что такое свинг?
  4. ^ "Статический импорт"
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: a27a75c222127b3e0fe31d2cc1258fab__1720023240
URL1:https://arc.ask3.ru/arc/aa/a2/ab/a27a75c222127b3e0fe31d2cc1258fab.html
Заголовок, (Title) документа по адресу, URL1:
Constant interface - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)