繁体   English   中英

Java Hello World传递CheckStyle

[英]Java Hello World to pass CheckStyle

所以我是使用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类创建一个私有构造函数并使默认参数最终?

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

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

第一期在这里得到解答在此处记录 简短的回答是,您没有向HelloWorld类提供任何实例成员,那么为什么要允许它们创建实例? 这就是为什么建议创建private构造函数的原因。

第二期 - 在这里说明。 简短回答 - 在执行方法算法期间更改参数值可能会造成混淆,应该避免。 这就是为什么建议将它们声明为final

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

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

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

对于这个“Hello World”示例,可以这样做。 但是在RL代码中,您希望从HelloWorld类创建一个实例,然后添加一个“business”方法(包含您的逻辑的方法)。

编辑:第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 ......完美的混乱......

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM