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

时间:2008-10-28 17:55:30

标签: java constants

例如:

public void doSomething() {

    final double MIN_INTEREST = 0.0;

    // ...  
}

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

7 个答案:

答案 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的新常量。