【问题标题】:Where to put constants in a class: standards and best practice在类中放置常量的位置:标准和最佳实践
【发布时间】:2014-03-14 18:46:04
【问题描述】:

在为脚本结果编写一些自定义流阅读器时,类中存在相当多的常量(主要用于预期的标签和关键字),我想知道是否有任何类型的标准、约定或最佳实践将常量(在此处阅读 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 已被丢弃以减轻上述示例代码的负担。

【问题讨论】:

  • 您真的打算在每次方法调用时都写入 System.out 吗?为什么将这些字符串定义为常量?它们只使用一次,并且使用常量会使代码的可读性低于直接使用文字字符串。
  • @JBNizet 这个简单的代码只是为了这个问题的一个例子,我选择了String,但它可以是任何类型。当然,定义 use once 字段有点过多,但请尝试将上面定义的常量外推为在实际使用中的类(或方法)中多次使用。

标签: java coding-style constants standards conventions


【解决方案1】:

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

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

3.4.2 类成员排序

类成员的排序可以对 可学习性,但没有一个正确的方法可以做到这一点。 不同的类可能对它们的成员进行不同的排序。

重要的是每个类都以某种逻辑对其成员进行排序 订单,如果被问到,它的维护者可以解释。例如,新 方法不只是习惯性地添加到类的末尾,因为 将产生“按添加日期按时间顺序”排序,这不是 逻辑顺序。

通常的做法是将常量放在最前面,但没有绝对的要求。如果您有很多常量并且需要组织它们,则将它们分组到枚举中是一种选择。

【讨论】:

  • 有趣的引用和枚举是常量负载类的一个很好的替代建议。谢谢!
【解决方案2】:

习惯上,常量位于顶部,并以大写字母命名。正如@AlexisLeclerc 在 cmets 中所说,您应该只在不止一次使用常量时使用常量,否则只会使代码更难阅读。但是,这是惯用的,不是标准的。

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

【讨论】:

    猜你喜欢
    • 2015-03-03
    • 1970-01-01
    • 2011-12-08
    • 1970-01-01
    • 2021-10-18
    • 2010-10-04
    • 2014-07-22
    • 1970-01-01
    相关资源
    最近更新 更多