Как Вы определяете класс констант в Java?

Вам необходимо обновить плагин Butter Knife внутри вашего проекта build.gradle примерно так:

buildscript {
  repositories {
    mavenCentral()
   }
  dependencies {
    classpath 'com.jakewharton:butterknife-gradle-plugin:9.0.0-rc2'
  }
}
72
задан tereško 12 July 2014 в 07:51
поделиться

9 ответов

Используйте заключительный класс. для простоты можно затем использовать статический импорт для многократного использования значений в другом классе

public final class MyValues {
  public static final String VALUE1 = "foo";
  public static final String VALUE2 = "bar";
}

в другом классе:

import static MyValues.*
//...

if(variable.equals(VALUE1)){
//...
}
77
ответ дан user54579 24 November 2019 в 12:36
поделиться

Ваши состояния разъяснения: "Я не собираюсь использовать перечисления, я ничего не перечисляю, просто собрав некоторые константы, которые не связаны друг с другом всегда".

, Если константы не связаны друг с другом вообще, почему Вы хотите собрать их вместе? Поместите каждую константу в класс, с которым это является самым тесно связанным.

37
ответ дан Jon Skeet 24 November 2019 в 12:36
поделиться

Поскольку Joshua Bloch отмечает в Эффективном Java:

  • Интерфейсы должны только использоваться для определения типов,
  • , абстрактные классы не предотвращают instanciability (они могут быть разделены на подклассы и даже предположить, что разработаны, чтобы быть разделенными на подклассы).

можно использовать Перечисление, если все константы связаны (как названия планеты), поместите постоянные величины в классы, они связаны с (если у Вас есть доступ к ним), или используйте не instanciable служебный класс (определите частного конструктора по умолчанию).

class SomeConstants
{
    // Prevents instanciation of myself and my subclasses
    private SomeConstants() {}

    public final static String TOTO = "toto";
    public final static Integer TEN = 10;
    //...
}

Затем как уже указано, можно использовать статический импорт для использования констант.

12
ответ дан Sébastien RoccaSerra 24 November 2019 в 12:36
поделиться

Мой предпочтительный метод не состоит в том, чтобы сделать этого вообще. Возраст констант в значительной степени умер, когда Java 5 представил безопасные с точки зрения типов перечисления. И даже к тому времени Josh Bloch опубликовал (немного более многословную) версию этого, которое работало над Java 1.4 (и ранее).

, Если Вам не нужна совместимость с некоторым унаследованным кодом, нет действительно никакой причины использовать названный Строкой/целочисленными константами больше.

6
ответ дан cletus 24 November 2019 в 12:36
поделиться

Просто используйте заключительный класс.

, Если Вы хотите смочь добавить другие значения, используют абстрактный класс.

Это не имеет много смысла с помощью интерфейса, интерфейс, как предполагается, указывает контракт. Вы просто хотите объявить некоторые постоянные величины.

3
ответ дан Megacan 24 November 2019 в 12:36
поделиться

Не перечисления лучший выбор для этих видов материала?

3
ответ дан Boris Pavlović 24 November 2019 в 12:36
поделиться

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.";
}
3
ответ дан Tom Hawtin - tackline 24 November 2019 в 12:36
поделиться

Или 4. Поместите их в класс, который содержит логику, которая использует константы большинство

... извините, не мог сопротивляться ;-)

1
ответ дан Simon Groenewolt 24 November 2019 в 12:36
поделиться

Мои предложения (в порядке убывания предпочтения):

1) Не делайте этого. Создайте константы в фактическом классе, где они являются самыми релевантными. При наличии 'мешка констант' класс/интерфейс действительно не применяет лучшие методы OO.

Я и все остальные, время от времени игнорируем № 1. Если Вы собираетесь сделать это затем:

2) заключительный класс с частным конструктором Это будет, по крайней мере, препятствовать тому, чтобы любой неправильно использовал Ваш 'мешок констант' путем расширения/реализации его для получения легкого доступа к константам. (Я знаю, что Вы сказали, что не сделаете этого - но это не означает кого-то приезжающего после того, как Вы не будете),

3) взаимодействуйте через интерфейс Это будет работать, но не мое предпочтение, дающее возможное упоминание злоупотребления в № 2.

В целом просто потому что это константы, не означает, что Вы не должны все еще применять нормальные oo принципы к ним. Если никто, но на классе не заботится о константе - это должно быть частным и в том классе. Если только тесты заботятся о константе - это должно быть в тестовом классе, не производственном коде. Если константа определяется в нескольких местах (не только случайно то же) - осуществляют рефакторинг для устранения дублирования. И так далее - рассматривают их как Вы, был бы метод.

21
ответ дан kenj0418 24 November 2019 в 12:36
поделиться
Другие вопросы по тегам:

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