【问题标题】:Java Hello World to pass CheckStyleJava Hello World 通过 CheckStyle
【发布时间】:2017-08-01 20:28:39
【问题描述】:

所以我是使用 checkstyle 的新手,对于我的简单 HelloWorld Java 程序,我收到了很多我不理解的错误。

我的代码:

package <package_name>;

/**
* A simple class to compile.
*/
public class HelloWorld {

 /**
  * @param args standard main parameters
  */

    public static void main(String[] args) {
        System.out.println("hello world");
    }
}

我收到错误消息:

Line 6: Utility classes should not have a public or default constructor
Line 10: Parameter args should be final

为什么会这样?我是否有必要为我的main 类创建一个私有构造函数并将默认参数设为最终参数?

【问题讨论】:

    标签: java checkstyle


    【解决方案1】:

    对于像 Main 类这样的 Utility 类,最好创建一个私有构造函数,以免 java 编译器自己编写默认的无参数构造函数 Main()

    Java 总是在将参数发送到方法之前制作一个副本。这里的 final 关键字仅表示在方法内部不能重新分配变量。 (请注意,如果您有像 String[] 这样的最终对象,您仍然可以更改对象的属性。

    【讨论】:

      【解决方案2】:

      第一个问题已回答 here 并记录在 here。简短的回答是您没有向HelloWorld 类提供任何实例成员,那么为什么允许他们创建实例呢?这就是为什么建议创建 private 构造函数的原因。

      第二期 - 声明为here。简短的回答 - 在方法算法的执行过程中更改参数的值可能会令人困惑,应该避免。这就是为什么建议声明它们final

      【讨论】:

        【解决方案3】:

        可能至少需要创建一个私有构造函数,添加以下内容:

        /**
         * Private default constructor
         */
        private HelloWorld () {
        }
        

        这应该让它消失。这里的原因是因为 Java 编译器“认为”你想要创建一个实用程序类,因为它只看到公共静态方法。在这种情况下,最好使用私有默认构造函数。

        对于这个“Hello World”示例,这样做很好。但在 RL 代码中,您想从 HelloWorld 类创建一个实例,然后向其中添加“业务”方法(包含您的逻辑的方法)。

        编辑:第 10 行的警告很好,因为使用final 作为参数通常意味着您无法更改参数的值:

        public class Foo {
            public Foo () {
            }
        
            public void doBar (final Bar bar) {
                // Won't work:
                bar = null;
        
                // Will work!
                bar.callMe();
            }
        }
        
        public class Bar {
            public Bar {
            }
        
            public void callMe () {
                // Do something
            }
        }
        

        现在只需删除 final 即可编译,但会向您发出警告,告知您更改了参数。这会导致意想不到的副作用,即(后来在较大的项目中)方法在“某处”更改了某些参数。

        试想一下:+200k 行代码(没有 cmets!)并且没有 final 用于参数......完全混乱......

        接受答案的海报说,这里只是更多细节和一个很好的理由。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-12-14
          • 2015-04-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-06-18
          • 1970-01-01
          相关资源
          最近更新 更多