如果你有几个静态的final 变量或者常数,但是必须在不同的数据类型之间进行转换,比方从int到Integer,你可以使用Constant类。
在编程中最早的一课就是不要在程序里到处写下数字,而是应该把它们放在一些特定的变量里。许多程序代码会与下面这行类似:
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) 也是合法的而且无法避免。
第二个问题是方法签名是与传递的int捆绑在一起的。这意味着把int修改成long或者另一个对象类型的话会造成大量的代码需要改动。
下面的类提供了一个解决这两个问题的方法:
packagecom.generationjava.lang;
public class Constant {
private final Object value;
public Constant() {
this.value = new Object();
}
public Constant(Object obj) {
this.value = obj;
}
public Constant(inti) {
this.value = new Integer(i);
}
// ... 许多其它重载的构造函数
public Object getValue() {
returnthis.value;
}
publicintintValue() {
return ((Integer)this.value).intValue();
}
// ... 许多其它重载的访问函数
public String toString() {
returnthis.value.toString();
}
}
事实上,这只是捆绑了一个Object对象的简单的类。它提供了一些重载的函数,这样可以容易的访问一些原始数据类型,但是这些类的实质并不复杂。
我们不必再使用int类型的常量,现在我们有了类型为Constant的常量,或者在必要的情况下可以是NumberConstant类型的,这个类扩展了Constant类。orderEggs方法现在可以使用一个NumberConstant类型的参数而MONTHS_IN_YEAR就再也不会合法了。另外,HTTP_DEFAULT_PORT现在可以是PortConstant类型的了,它扩展Constant类型而且有一个 getBackupPort()方法,它返回8080 。
通过使用一个Constant 类,这个API就变得更加可读。你不会再看见程序中传递一个int参数,相反的,一个包含了更重要的参数的Constant 对象会被传递进去。另外,一个int变量会被编译进客户端的类以便以后改变变量的话不会需要改变任何使用过它的代码。把一个非OO的处理常量的方法转变成一个更强大的OO方法能够使应用程序更加稳定。
