29

例如:

public void doSomething() {

    final double MIN_INTEREST = 0.0;

    // ...  
}

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

4

7 回答 7

40

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

于 2008-10-28T18:00:28.210 回答
21

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

例如,作用域为 final 的方法在公共 API 中不可见。有时,这些信息可能对您班级的用户没有用处,应该向上移动。

在您在问题中给出的示例中,我会说 MIN_INTEREST 可能是用户希望获得的那些信息之一,并且它的范围应该是类,而不是方法。(虽然,示例代码没有上下文,我的假设可能完全错误。)

于 2008-10-28T18:26:48.703 回答
10

从技术上讲,Java 中不存在“方法范围的常量”之类的东西。您所指的只是一个最终的局部变量;每次方法调用都会创建一个销毁的。

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

于 2008-11-07T02:04:58.720 回答
5

我自己也使用过这种方法作用域常量,但有时同事会在代码审查期间对其进行修改。同样,这些同事不喜欢阅读/编写开源软件,但他们习惯于企业软件。

我告诉他们,如果在单个方法中使用类级别常量是没有意义的,但我发现不止一位同事坚持将其向上移动。我通常会遵守,因为除非它影响可读性和/或性能,否则我不会那么死板。

于 2008-10-28T18:17:04.947 回答
4

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

您可能会担心,因为这是一个常数,因此,它可能似乎属于某个全局属性表。也许确实如此。也许不是。您的担忧是有道理的,但没有一个最适合所有常量的地方。

于 2008-10-28T18:45:51.567 回答
1

我对此有不同的看法:恕我直言,最好将它们放在文件/类范围内,特别是如果您出于这个原因在团队中工作:假设您从一小段代码开始......

public void doSomething() {

  final double MIN_INTEREST = 0.0;

  // ...  
}

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

如果您改为在文件/类范围内添加所有常量,工程师可以在1一个地方查找现有常量,并2从其他有意义的常量中派生一些常量。(例如,如果您有一个常量,pi您可能还想定义一个值为 的新常量pi/2)。

于 2017-02-25T19:38:27.433 回答
-1

您可以在类级别或方法(本地)级别定义最终变量的原因是您可以覆盖(本地)方法内部的全局静态常量。

例子:

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

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

于 2008-10-28T18:01:07.600 回答