例如:
public void doSomething() {
final double MIN_INTEREST = 0.0;
// ...
}
就个人而言,我宁愿看到这些替换常量在类级别静态声明。我想我正在寻找关于此事的“行业观点”。
我认为如果它们被多种方法使用,你应该只将它们放在类级别。如果仅在该方法中使用它,那对我来说很好。
我的出发点是每个变量或常量都应该被声明/初始化为尽可能接近它的第一次使用/实用(即不要将逻辑代码块分成两半,只是为了声明更近的几行),并且范围为尽可能紧密。——除非你能给我一个该死的好理由为什么它应该不同。
例如,作用域为 final 的方法在公共 API 中不可见。有时,这些信息可能对您班级的用户没有用处,应该向上移动。
在您在问题中给出的示例中,我会说 MIN_INTEREST 可能是用户希望获得的那些信息之一,并且它的范围应该是类,而不是方法。(虽然,示例代码没有上下文,我的假设可能完全错误。)
从技术上讲,Java 中不存在“方法范围的常量”之类的东西。您所指的只是一个最终的局部变量;每次方法调用都会创建一个销毁的。
http://www.java-tips.org/java-se-tips/java.lang/how-do-i-declare-a-constant-in-java.html
我自己也使用过这种方法作用域常量,但有时同事会在代码审查期间对其进行修改。同样,这些同事不喜欢阅读/编写开源软件,但他们习惯于企业软件。
我告诉他们,如果在单个方法中使用类级别常量是没有意义的,但我发现不止一位同事坚持将其向上移动。我通常会遵守,因为除非它影响可读性和/或性能,否则我不会那么死板。
信息隐藏和模块化是关键原则,缩小范围是更好的信息隐藏。如果只有方法需要该常量,则隐藏是好的。如果常量在其他地方有用,请将其扩展到更广泛的范围,但仅限于需要的范围。
您可能会担心,因为这是一个常数,因此,它可能似乎属于某个全局属性表。也许确实如此。也许不是。您的担忧是有道理的,但没有一个最适合所有常量的地方。
我对此有不同的看法:恕我直言,最好将它们放在文件/类范围内,特别是如果您出于这个原因在团队中工作:假设您从一小段代码开始......
public void doSomething() {
final double MIN_INTEREST = 0.0;
// ...
}
和你团队的其他成员用一大堆方法扩展了这个类,现在这个类是一个很棒500 lines
/50 methods
巨大的类。想象一下工程师尝试使用常量添加新方法的经历,他们将不得不1
扫描整个类以寻找符合他们需要的常量,2
将常量移动到类范围,希望与现有代码没有冲突,并且3
也添加他们的方法。
如果您改为在文件/类范围内添加所有常量,工程师可以在1
一个地方查找现有常量,并2
从其他有意义的常量中派生一些常量。(例如,如果您有一个常量,pi
您可能还想定义一个值为 的新常量pi/2
)。
您可以在类级别或方法(本地)级别定义最终变量的原因是您可以覆盖(本地)方法内部的全局静态常量。
例子:
public class Test {
final double MIN_INTEREST = 0.0;
/**
* @param args
*/
public static void main(String[] args) {
Test test = new Test();
test.doSomethingLocal();
test.doSomethingGlobal();
}
public void doSomethingGlobal() {
System.out.println("Global-> " + MIN_INTEREST);
}
public void doSomethingLocal() {
final double MIN_INTEREST = 0.1;
System.out.println("Local-> " + MIN_INTEREST);
}
}
输出将是:
Local-> 0.1
Global-> 0.0
所以你的问题没有任何意义。