Вам необходимо обновить плагин Butter Knife внутри вашего проекта build.gradle
примерно так:
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'com.jakewharton:butterknife-gradle-plugin:9.0.0-rc2'
}
}
Используйте заключительный класс. для простоты можно затем использовать статический импорт для многократного использования значений в другом классе
public final class MyValues {
public static final String VALUE1 = "foo";
public static final String VALUE2 = "bar";
}
в другом классе:
import static MyValues.*
//...
if(variable.equals(VALUE1)){
//...
}
Ваши состояния разъяснения: "Я не собираюсь использовать перечисления, я ничего не перечисляю, просто собрав некоторые константы, которые не связаны друг с другом всегда".
, Если константы не связаны друг с другом вообще, почему Вы хотите собрать их вместе? Поместите каждую константу в класс, с которым это является самым тесно связанным.
Поскольку Joshua Bloch отмечает в Эффективном Java:
можно использовать Перечисление, если все константы связаны (как названия планеты), поместите постоянные величины в классы, они связаны с (если у Вас есть доступ к ним), или используйте не instanciable служебный класс (определите частного конструктора по умолчанию).
class SomeConstants
{
// Prevents instanciation of myself and my subclasses
private SomeConstants() {}
public final static String TOTO = "toto";
public final static Integer TEN = 10;
//...
}
Затем как уже указано, можно использовать статический импорт для использования констант.
Мой предпочтительный метод не состоит в том, чтобы сделать этого вообще. Возраст констант в значительной степени умер, когда Java 5 представил безопасные с точки зрения типов перечисления. И даже к тому времени Josh Bloch опубликовал (немного более многословную) версию этого, которое работало над Java 1.4 (и ранее).
, Если Вам не нужна совместимость с некоторым унаследованным кодом, нет действительно никакой причины использовать названный Строкой/целочисленными константами больше.
Просто используйте заключительный класс.
, Если Вы хотите смочь добавить другие значения, используют абстрактный класс.
Это не имеет много смысла с помощью интерфейса, интерфейс, как предполагается, указывает контракт. Вы просто хотите объявить некоторые постоянные величины.
Не перечисления лучший выбор для этих видов материала?
enum
с прекрасны. IIRC, один объект в эффективном Java (2-й Ed) имеет enum
константы, перечисляющие стандартные опции, реализовывая [ключевое слово Java] interface
для любого значения.
Мое предпочтение состоит в том, чтобы использовать [ключевое слово Java] interface
по final class
для констант. Вы неявно добираетесь public static final
. Некоторые люди будут утверждать, что interface
позволяет плохим программистам реализовывать его, но плохие программисты собираются написать код, который сосет то независимо от того, что Вы делаете.
, Который выглядит лучше?
public final class SomeStuff {
private SomeStuff() {
throw new Error();
}
public static final String SOME_CONST = "Some value or another, I don't know.";
}
Или:
public interface SomeStuff {
String SOME_CONST = "Some value or another, I don't know.";
}
Или 4. Поместите их в класс, который содержит логику, которая использует константы большинство
... извините, не мог сопротивляться ;-)
Мои предложения (в порядке убывания предпочтения):
1) Не делайте этого. Создайте константы в фактическом классе, где они являются самыми релевантными. При наличии 'мешка констант' класс/интерфейс действительно не применяет лучшие методы OO.
Я и все остальные, время от времени игнорируем № 1. Если Вы собираетесь сделать это затем:
2) заключительный класс с частным конструктором Это будет, по крайней мере, препятствовать тому, чтобы любой неправильно использовал Ваш 'мешок констант' путем расширения/реализации его для получения легкого доступа к константам. (Я знаю, что Вы сказали, что не сделаете этого - но это не означает кого-то приезжающего после того, как Вы не будете),
3) взаимодействуйте через интерфейс Это будет работать, но не мое предпочтение, дающее возможное упоминание злоупотребления в № 2.
В целом просто потому что это константы, не означает, что Вы не должны все еще применять нормальные oo принципы к ним. Если никто, но на классе не заботится о константе - это должно быть частным и в том классе. Если только тесты заботятся о константе - это должно быть в тестовом классе, не производственном коде. Если константа определяется в нескольких местах (не только случайно то же) - осуществляют рефакторинг для устранения дублирования. И так далее - рассматривают их как Вы, был бы метод.