将常量放在一个类中的位置:标准和最佳实践

时间:2014-03-14 18:46:04

标签: java coding-style constants standards conventions

为脚本结果编写一些自定义流阅读器时,类中存在很多常量(主要用于预期的标签和关键字),我想知道是否有任何类型的标准,约定或最佳实践把常量(在这里读static final个字段)放在一个类中?

更具体地说,最好将每个常量放在类的顶部,还是将它们放在类有用的区域中,并将公共组合在顶部?

通过将所有内容放在顶部,在我看来,这可能更容易找到你在同一个地方寻找的所有东西,但如果这个区域越来越大,它会变得无法抗拒:

public class Test {
    // Constants.
    private static final String CLASSNAME = Test.class.getSimpleName();
    private static final String COMMON = " = ";
    private static final String CONSTRUCTOR = "#constructor";
    private static final String METHOD_1 = "#method1";
    private static final String METHOD_2 = "#method2";

    public Test(String message) {
        System.out.println(CLASSNAME + CONSTRUCTOR + COMMON + message);
        method1(message);
        method2(message);
    }

    private void method1(String message) {
        System.out.println(CLASSNAME + METHOD_1 + COMMON + message);
    }

    private void method2(String message) {
        System.out.println(CLASSNAME + METHOD_2 + COMMON + message);
    }

    public static void main(String[] args) {
        new Test("Hello world!");
    }
}

通过对它们进行分组,对于仅在类的特定区域中使用的常量更有意义,但它可能会破坏通过类型添加到类中的漂亮的对称效果分组,并且可能会让它看起来凌乱

public class Test {
    // Common constants.
    private static final String CLASSNAME = Test.class.getSimpleName();
    private static final String COMMON = " = ";

    // Constructor constants.
    private static final String CONSTRUCTOR = "#constructor";

    public Test(String message) {
        System.out.println(CLASSNAME + CONSTRUCTOR + COMMON + message);
        method1(message);
        method2(message);
    }

    // Constant proper to method1(...).
    private static final String METHOD_1 = "#method1";

    private void method1(String message) {
        System.out.println(CLASSNAME + METHOD_1 + COMMON + message);
    }

    // Constant proper to method2(...).
    private static final String METHOD_2 = "#method2";

    private void method2(String message) {
        System.out.println(CLASSNAME + METHOD_2 + COMMON + message);
    }

    public static void main(String[] args) {
        new Test("Hello world!");
    }
}

输出:

Test#constructor = Hello world!
Test#method1 = Hello world!
Test#method2 = Hello world!

我知道这可能是一个主观的问题,但我主要想知道是否有任何(非)官方文件说明这一点,或者上述哪种情况被视为最佳做法,更有吸引力的工作与普通程序员一起。

请注意,Javadoc被丢弃以减轻上述示例代码。

2 个答案:

答案 0 :(得分:4)

Oracle网站上有一套标准的约定。有一个reference to how to layout the source code将静态变量置于实例变量之前,但对于常量没有什么特别之处。

Oracle风格指南自1999年以来一直没有更新,并且警告它信息可能不再有效。 Google has a more up-to-date style guide,它说:

  

3.4.2班级成员订购

     

班级成员的顺序可以产生很大的影响   可学习性,但没有一个正确的方法可以做到这一点。   不同的班级可能会以不同的方式订购会员。

     

重要的是每个班级的成员都有一定的顺序   如果被问到,维护者可以解释它的顺序。例如,新的   方法不仅仅习惯性地添加到类的末尾,就像那样   将按照按时间顺序排列"按时间顺序排列"订购,这不是   逻辑排序。

通常的做法是将常数放在最重要的位置,但是没有绝对的授权。如果你有很多常量并且需要组织它们,那么在枚举中对它们进行分组将是另一种选择。

答案 1 :(得分:1)

惯用法,常量位于顶部,并以大写字母命名。正如@AlexisLeclerc在评论中所说,你应该只在多次使用时使用常量,否则你只是让代码更难阅读。然而,这是惯用的,而不是标准的。

如果您按照描述对班级中的内容进行分组,则可能表明您实际上应该有两个或更多班级。