您对方法范围常量有何看法?

例如:

public void doSomething() { final double MIN_INTEREST = 0.0; // ... } 

就个人而言,我宁愿看到这些替换常量在类级别静态声明。 我想我正在寻找关于这个问题的“行业观点”。

我的起始位置应该声明/初始化每个变量或常量,尽可能接近它的第一次使用(即不要将代码的逻辑块分成两半,只是为了声明几行),并作为范围尽可能紧密。 – 除非你能给我一个很好的理由,为什么它应该是不同的。

例如,在公共API中不会显示方法作用域final。 有时这些信息可能对您的class级用户有用,并且应该向上移动。

在你在问题中给出的例子中,我会说MIN_INTEREST可能是用户想要掌握的那些信息之一,它应该限定在类中,而不是方法。 (虽然示例代码没有上下文,但我的假设可能完全错误。)

我认为如果它们被多种方法使用,你应该只将它们放在类级别。 如果只用于那种方法,那对我来说就好了。

从技术上讲,Java中没有“方法作用域常量”这样的东西。 你所指的只是一个最终的局部变量; 它是在每个方法调用时创建的。

http://www.java-tips.org/java-se-tips/java.lang/how-do-i-declare-a-constant-in-java.html

信息隐藏和模块化是关键原则,狭义范围是更好的信息隐藏。 如果该方法仅需要常量,则隐藏是好的。 如果常数在其他地方有用,请将其扩展到更广泛的范围,但仅限于需要的范围。

您可能担心,因为这是一个常量,因此,它似乎属于某些全局属性表。 也许确实如此。 也许它没有。 您的关注是有效的,但对于所有常量而言,没有一个最佳位置。

我自己使用了这种方法范围的常量,但是在代码审查期间,同事经常会对其进行修改。 同样,这些同事不是在阅读/编写开源,而是习惯于企业软件。

我告诉他们,如果在一个方法中使用它,那么使用类级别常量是没有意义的,但我发现不止一个同事坚持要将它移动到UP。 我通常遵守,因为我不是那么严格,除非它影响可读性和/或性能。

您可以在类级别或方法(本地)级别定义最终变量的原因是因为您可以覆盖(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 

所以你的问题没有任何意义。

我有一个不同的看法:恕我直言,最好把它们放在文件/类范围,特别是如果你因为这个原因在团队中工作:说你从一小段代码开始……

 public void doSomething() { final double MIN_INTEREST = 0.0; // ... } 

和你团队的其他成员一起用一大堆方法扩展了这个类,现在这个类是一个很棒的500 lines / 50 methods巨型类。 想象一下工程师尝试使用常量添加新方法的经验,他们必须扫描整个类,寻找符合其需要的常量, 2将常量移到类范围,希望不存在与现有的冲突代码和3也添加他们的方法。

如果你首先在文件/类范围添加所有常量,工程师有一个单独的位置来查找现有的常量, 2从其他有意义的派生出一些常量。 (例如,如果你有pi的常量,你可能还想定义一个值为pi/2的新常量)。