七、 不要使用字面常量
除了一些大家都明白的如0值,空值null,和空串””外,不要在java代码中使用字面常量
看上面的例子。无耐的是,我们经常在j2ee项目中大量出现这样的代码。1 if (ware.getWareDetailList() != null 2 && ware.getWareDetailList().size() > 100) ...{ 3 request.setAttribute(super.SERVICE_BUSINESS_INFO, 4 "物品数量超过了上限,请您将物品数量控制在100件以内");
1. 这样的代码没有明确的意义。必须被迫阅读代码来猜测100的含义。
2. 代码容易出错,我们必须被迫比较不同的字面值来确信它们是相同的,而且我们很容易错误的输入。
3. 修改100这个常数时,可能需要修改多处。
比较好的做法是使用一个常数,在JAVA中意味作使用static final的变量.
一般情况下,这已经OK了。但是在有些情况下它仍然不够好,假如对于每次发送的物品数量限制并不是总是相同的,今天的常量,在明天可能就是一个经常变化的变量。1private static final int WARE_COUNT_LIMIT = 100; 2if (ware.getWareDetailList() != null 3&& ware.getWareDetailList().size() > WARE_COUNT_LIMIT ) ...{ 4request.setAttribute(super.SERVICE_BUSINESS_INFO,
"物品数量超过了上限,请您将物品数量控制在100件以内"); 5
可能下面的版本会更灵活一些:
这样我们可以把对物品数量的控制延迟到子类进行,子类可以通过重写wareCountLimit()方法来灵活控制。1private static final int DEFAULT_WARE_COUNT_LIMIT = 100; 2protected int wareCountLimit()...{ 3return DEFAULT_WARE_COUNT_LIMIT; 4} 5if (ware.getWareDetailList() != null 6&& ware.getWareDetailList().size() > wareCountLimit()) ...{ 7request.setAttribute(super.SERVICE_BUSINESS_INFO,
"物品数量超过了上限,请您将物品数量控制在100件以内"); 8
如何设计一个常量,可以有下面的标准来进行参照:
1. 如果字面常量应该是代码中的一部分,不应该使用常量变量或方法。
比如:SQL语句。SQL语句本身就应该是代码的一部分,所以不应该再它们声明一个常量。
2. 永远都不会变化的常量或者变化的可能性相当少的常量,声明为static final的常量。
例如:在所有应用服务器都相同的JNDI名。
3.在编译时可能会发生改变的常量,声明子类可以重写的protected的方法。
例如:在应用服务器中可能需要变化的JNDI名,如TransactionManager的名称
4.在运行时可能会发生改变的常量,声明一个protected方法.
例如:物品数量限制
5. 受国际化影响的常量,声明一个proteced的方法。
例如:根据不同的Local信息,需要显示不同的错误信息或语言
这个protected方法返回一个从ResourceBundle中查找的值。
八、 内部类和接口
在JAVA中使用内部类和接口可以避免命名空间污染,内部类通常用来帮助外部类有一个一致的责任。除非进行Swing编程,尽可能的少用匿名内部类。而使用一个有类名的内部类会带来更多的好处。比如可以使用构造函数。
使用内部类不能够实现代码重用。会导致重复代码的产生。在使用的时候要进行权衡。