Java расширяемые константы - PullRequest
0 голосов
/ 04 ноября 2011

У меня есть программная установка с 2 уровнями, основным и пользовательским уровнями. Основной уровень имеет определенные константы, которые пользовательский уровень должен иметь возможность расширять. Более конкретно:

public class CoreConstants
{ 
  public static long CORE_CONSTANT_1 = 1;
  public static long CORE_CONSTANT_2 = 2;
}

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

public class CustomerConstants extends CoreConstants
{
  public static long CUSTOMER_CONSTANT_1 = 1000; // starting range = 1000
}

Есть ли более распространенный способ справиться с этим?

Дополнительная информация : Причиной наследования является определение начального диапазона пользовательских констант. В классе CoreConstants я мог бы установить начальное значение для пользовательских констант. Специфичные для клиента константы могут быть определены следующим образом:

public static long CUSTOMER_CONSTANT_1 = customStartValue + 1;
public static long CUSTOMER_CONSTANT_2 = customStartValue + 2;

Ответы [ 2 ]

3 голосов
/ 04 ноября 2011

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

interface CoreConstant {
    int intValue();
}

enum CoreConstants implements CoreConstant {
    CORE_CONSTANT_1(1),
    CORE_CONSTANT_2(2);
    private final int intValue;
    public CoreConstants(int intValue) { this.intValue = intValue; }
    public int intValue() { return intValue; }
}

interface CustomerConstant extends CoreConstant {}

enum CustomerConstants implements CustomerConstant {
    CUSTOMER_CONSTANT_1(1000);
    private final int intValue;
    public CustomerConstants(int intValue) { this.intValue = intValue; }
    public int intValue() { return intValue; }    
}

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

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

interface CoreConstants {
    public static final int CORE_CONSTANT_1 = 1;
}
1 голос
/ 04 ноября 2011

Нет причин иметь механизм наследования между этими двумя классами.Наследование используется для полиморфизма, и у вас есть только статические члены здесь.Просто есть два отдельных класса.Я бы даже сделал их окончательными и не инстанцируемыми:

public final class CoreConstants { 
    /**
     * Private constructor to prevent unnecessary instantiations
     */
    private CoreConstants() {
    }
}
...