Лучшая практика для глобальных констант, включающих магические числа - PullRequest
9 голосов
/ 14 октября 2010

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

Мне было интересно, каковы лучшие практики? Я говорю о глобальных константах. Является ли enum лучшим выбором для хранения констант в Java?

Ответы [ 5 ]

30 голосов
/ 14 октября 2010

Для магических чисел, где действительное число имеет значение, а не просто метку, вы, очевидно, не должны использовать перечисления.Тогда старый стиль все еще лучший.

public static final int PAGE_SIZE = 300;

Когда вы просто маркируете что-то, вы используете перечисление.

enum Drink_Size
{
   TALL,
   GRANDE,
   VENTI;
}

Иногда имеет смысл поместить все ваши глобальные константы вих собственный класс, но я предпочитаю помещать их в класс, к которому они наиболее тесно привязаны.Это не всегда легко определить, но в конце концов самое важное, что ваш код работает:)

4 голосов
/ 14 октября 2010

Да, это так. Enum - лучший выбор.

Вы получаете бесплатно:

  • Константы
  • неизменных объектов
  • одиночки

Все в одном.

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

2 голосов
/ 14 октября 2010

Enum лучше всего подходит для большинства случаев, но не для всех.Некоторые из них лучше поместить, как раньше, то есть в специальный класс с открытыми статическими константами.

Пример, где enum не является лучшим решением для математических констант, таких как PI.Создание перечисления для этого ухудшит код.

enum MathConstants {
    PI(3.14);

    double a;        

    MathConstants(double a) {
       this.a = a;
    }

    double getValueA() {
       return a;
    }
}

Использование:

MathConstants.PI.getValueA();

Ужасно, не правда ли?Сравните с:

MathConstants.PI;
1 голос
/ 14 октября 2010

Использование интерфейсов для хранения констант - это своего рода злоупотребление интерфейсами.

Но использование Enums - не лучший способ для каждой ситуации.Часто достаточно простой int или любой другой константы.Определение экземпляров собственного класса («перечисления, безопасные для типов») еще более гибко, например:

public abstract class MyConst {
  public static final MyConst FOO = new MyConst("foo") {
    public void doSomething() {
      ...
    }
  };

  public static final MyConst BAR = new MyConst("bar") {
    public void doSomething() {
      ...
    }
  };

  protected abstract void doSomething();

  private final String id;

  private MyConst(String id) {
    this.id = id;
  }

  public String toString() {
    return id;
  }
  ...
}
0 голосов
/ 12 сентября 2012

Забудьте о перечислениях - теперь, когда статический импорт доступен в Java, поместите все свои константы в класс REAL (вместо интерфейса), а затем просто импортируйте статические члены из всех остальных, используя import static <Package or Class>.

...