Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 你对方法作用域常量有什么看法?_Java_Constants - Fatal编程技术网

Java 你对方法作用域常量有什么看法?

Java 你对方法作用域常量有什么看法?,java,constants,Java,Constants,例如: public void doSomething() { final double MIN_INTEREST = 0.0; // ... } 就个人而言,我宁愿看到这些替换常量在类级别静态声明。 我想我正在寻找一个关于这个问题的“行业观点”。我认为只有当它们被多个方法使用时,才应该将它们放在类级别。如果它只在该方法中使用,那么我觉得这很好。之所以可以在类级别或方法(局部)级别定义最终变量,是因为可以在(局部)方法中重写全局静态常量 例如: public class

例如:

public void doSomething() {

    final double MIN_INTEREST = 0.0;

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

我认为只有当它们被多个方法使用时,才应该将它们放在类级别。如果它只在该方法中使用,那么我觉得这很好。

之所以可以在类级别或方法(局部)级别定义最终变量,是因为可以在(局部)方法中重写全局静态常量

例如:

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

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

我自己也用过这个方法来定义常量的作用域,但偶尔有同事会在代码审查时修改它。同样,这些同事不喜欢读/写开源软件,但他们习惯于企业软件

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

我的出发点是,每个变量或常量都应该尽可能地在第一次使用时声明/初始化/实际使用(即,不要将逻辑代码块一分为二,只需声明几行即可),并尽可能严密地确定范围。-除非你能给我一个很好的理由让它与众不同

例如,方法范围的final在公共API中不可见。有时,这些信息对类的用户可能很有用,应该向上移动


在您在问题中给出的示例中,我想说MIN_INTEREST可能是用户希望获得的信息之一,它的作用域应该是类,而不是方法。(尽管示例代码没有上下文,我的假设可能是完全错误的。)

信息隐藏和模块化是关键原则,窄范围是更好的信息隐藏。如果该方法只需要常量,则隐藏效果良好。如果该常数在其他地方有用,则将其引入更广泛的范围,但仅限于所需的范围


您可能会担心,因为这是一个常量,因此,它似乎属于某些全局属性表。也许是的。也许没有。您的担心是正确的,但是没有一个地方适合所有常量

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


我对此有不同的看法:我认为最好将它们放在文件/类范围内,尤其是当您在团队中工作时,因为这个原因:假设您从一小段代码开始

public void doSomething() {

  final double MIN_INTEREST = 0.0;

  // ...  
}
你们团队的其他成员用一大堆方法扩展了这个类,现在这个类是一个很棒的
500行
/
50个方法
巨型类。想象一下,一位工程师试图添加一个带有常数的新方法,他们必须
1
扫描整个类,寻找符合他们需要的常数,
2
将常数移动到类范围,希望与现有代码没有冲突,
3
也添加他们的方法


如果您从文件/类范围开始添加所有常量,工程师可以在
1
单一位置查找现有常量,
2
从其他有意义的地方派生一些常量。(例如,如果您有一个用于
pi
的常数,您可能还需要定义一个新常数,其值为
pi/2
)。

如果问题有点不清楚,很抱歉。我将重新措辞这个问题。方法作用域的子项常量是否常用?我认为chills42提供了一个相当合理的答案。谢谢chills。我正朝着这个方向思考,但很好奇是否有任何理由避免方法声明。例如,我发现在方法中声明的常量太多,无法从逻辑中转移注意力。我完全同意,我认为将常量值尽可能地保持在使用它的位置很重要,因此随着时间的推移,您自然会检查常量,以确保它们仍然有意义。如前所述,如果有多个方法使用该常量,则该常量应为类级别。如果该常量包含用户希望获得的信息(默认值),则应在类级别确定其范围。在我下面的回答中,我说明了MIN_兴趣可能需要通过公共api进行访问,因此,应该在类的范围内。如果类是单例,那么在类级别声明常量相对于在方法级别声明常量是否有内存使用优势?任何想法:@chriscudmore。是否有证据表明它将在每次方法执行时重新声明?