Из того, что я читал с использованием интерфейсов для определения констант, обычно рассматривается в Java, за исключением случаев, когда вы предполагаете, что константы, наследуемые классами, реализуют интерфейс. Но я часто встречался с кодом, подобным этому, в программах Android:
interface Tags { String BLOCK = "block"; String TITLE = "title"; String START = "start"; String END = "end"; String TYPE = "type"; }
Лично мне нравится иметь возможность группировать константы вместе, как это, в пространство имен. Итак, мой вопрос – есть ли недостаток в этом? Я предполагаю, что это, вероятно, не так эффективно, как использование статических окончательных строк, поскольку компилятор может их встроить.
Во-первых, знайте, что поля в интерфейсе неявно статичны и окончательны.
Постоянные интерфейсы обычно рассматриваются как анти-шаблон (см. http://en.wikipedia.org/wiki/Constant_interface ). Лучшая альтернатива:
public final class Tags { public static final String BLOCK = "block"; // Other constants... private Tags() {} }
Поскольку класс Tags
является окончательным, ни один класс не может его расширять. Вместо этого классы, которые хотят использовать константы из Tags
просто выполняют:
import my.package.Tags;
а потом:
System.out.println(Tags.BLOCK);
С Java 5 константы можно импортировать напрямую:
import static my.package.Tags.BLOCK; // Other static imports...
Поэтому их можно использовать так:
System.out.println(BLOCK);