如果你有几个static public final变量或者常量,但是又不得不对它们进行转换,例如将int变成Integer类型,那么不妨采用常量类(Constant class)。
static public final int HTTP_DEFAULT_PORT = 80;然而,这将引起两个大问题。一个是这些量的值本应是唯一的但是往往不是,例如:
static public final int DOZEN = 12;
static public final int MONTHS_IN_YEAR = 12;
public void orderEggs(int number) {
...
}
在上面的代码段中,DOZEN和MONTHS_IN_YEAR是不可变化的,然而orderEggs(MONTHS_IN_YEAR)却又是合法的,并且没有办法停止其使用。
第二个问题是方法型别(methodsignature)被约束到一个传送的int参数。这意味着如果将这个int量修改成long型或者Object型将会导致大量代码的修改。
下面这个类提供了解决上述两个问题的方法:
package com.generationjava.lang;
public class Constant {
private final Object value;
public Constant() {
this.value = new Object();
}
public Constant(Object obj) {
this.value = obj;
}
public Constant(int i) {
this.value = new Integer(i);
}
// ... lots of other overloaded constructors
public Object getValue() {
return this.value;
}
public int intValue() {
return((Integer)this.value).intValue();
}
// ... lots of other overloaded accessors
public String toString() {
return this.value.toString();
}
}
事实上,上面只是一个用来包装对象的简单类。它提供了一些重载方法,使得原始简单类型可以轻松地采用,但是这个类本身并不复杂。
不再是int型的常量,我们现在有了Constant型的常量,而且如果需要,可以采用扩展Constant的NumberConstant型常量。OrderEggs方法现在可以接受NumberConstant型的参数了,MONTHS_IN_YEAR再也不会合法了。此外,可以用Constant 扩展出PortConstant类型,它具有getBackupPort() 方法并返回8080,那么HTTP_DEFAULT_PORT现在就可以作为PortConstant类型了。
通过使用Constant类,API的可读性增强了。现在不需要直接传送int型了,而是采用Constant这样一个包含了多个参数类型的类。另外,int变量将会被编译成客户类,这样今后再改变int变量就不需要改变多个地方了。从处理常量的非OO方式切换到OO方式将构造更加稳定的应用。