2011-11-04 75 views
0

我有一个软件设置2层,一个核心层和一个客户特定层。核心层定义了客户特定层应该能够扩展的常量。更具体的:Java可扩展常量

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; 

回答

3

整型常量一般都带有enum好多了更换,你可以实现你想要使用的枚举的接口是什么。

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类的设计。不幸的是你的情况,你不能扩展枚举。结果是在枚举类中有一些代码重复。否则,如果你想留在公共静态诠释模型,然后使用一个接口,而不是一个类,并最终确定常量。

interface CoreConstants { 
    public static final int CORE_CONSTANT_1 = 1; 
} 
+0

感谢关于枚举,可能适用于我的情况。关于使用接口,为什么会比使用类更好? –

+0

如果“类型”仅仅是一个常量容器,那么你永远不应该能够实例化它。你可以通过私有化构造函数来做到这一点,但是使用接口通常会更清晰。除非你确实需要一些功能,比如'valueOf(String)'方法。在这种情况下,您将返回一个类... – ptomli

+2

@ptomli:用于保存常量的接口通常被视为反模式。请参阅http://en.wikipedia.org/wiki/Constant_interface。在这种情况下,不需要公共的静态最终修饰符,因为接口的所有字段都是隐式的public,static和final。 –

1

没有理由在这两个类之间有继承机制。继承用于多态,并且此处只有静态成员。只有两个不同的课程。我甚至可以让他们最终与非可实例:

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

继承的原因现在我已经定义了客户特定常量的起始值。将此信息添加到原始问题。 –