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