Java Hello World 通过 CheckStyle

4

我是一个新手,正在使用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类创建一个私有构造函数并将默认参数设为final?
3个回答

4

对于像主类这样的实用程序类,最好创建一个私有构造函数,以防止Java编译器编写默认的无参数构造函数Main()

Java在将参数发送到方法之前总是会复制它们。这里的final关键字仅意味着在方法内部变量不能被重新分配。(请注意,如果您有一个像您的情况一样的final对象String[],您仍然可以更改对象的属性)。


2
第一个问题的答案在这里,并在这里有记录。简单来说,由于您没有为HelloWorld类提供任何实例成员,因此为什么要允许创建实例?这就是为什么建议创建一个private构造函数。
第二个问题在这里说明。简单来说,更改方法算法执行过程中参数的值可能会导致混淆,应该避免这样做。这就是为什么建议将它们声明为final的原因。

1

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

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

这应该就可以解决了。原因在于Java编译器“认为”你想创建一个工具类,因为它只看到了公共静态方法。在这种情况下,最好的做法是拥有一个私有默认构造函数。

对于这个“Hello World”的例子来说,这样做是可以的。但在真实代码中,你想要从你的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行代码(没有注释!),没有参数的final... 完美的混乱...

被接受的答案的发布者已经说过了,这里提供更多细节和一个好的理由。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接