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
class 创建一个私有构造函数并将默认参数设置为最终参数?
对于像您的 Main class 这样的 Utility classes,最好创建一个私有构造函数,以免让 java 编译器自己编写默认的无参数构造函数Main()
.
Java 总是在将参数发送到方法之前复制参数。这里的 final 关键字仅表示在方法内部不能重新分配变量。 (请注意,如果您有像您的情况那样的最终对象 String[]
,您仍然可以更改对象的属性)。
第 1 期已回答 here and is documented here。简短的回答是,您没有向 HelloWorld
class 提供任何实例成员,那么为什么允许他们创建实例呢?这就是为什么建议创建一个 private
构造函数。
第 2 期 - 说明 here。简短回答 - 在方法算法执行期间更改参数值可能会造成混淆,应该避免。这就是为什么建议声明它们 final
您可能需要至少创建一个私有构造函数,添加:
/**
* Private default constructor
*/
private HelloWorld () {
}
那应该会成功。这里的原因是因为 Java 编译器 "thinks" 你想制作一个实用程序 class 因为它只看到 public 静态方法。在这种情况下,最好的做法是拥有一个私有默认构造函数。
对于此 "Hello World" 示例,这样做很好。但是在 RL 代码中,你想从你的 HelloWorld
class 创建一个实例,然后向它添加一个 "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
即可编译,但会警告您更改了参数。这会导致意想不到的副作用,即(稍后在较大的项目中)方法更改了一些参数 "somewhere".
试想一下:+200k 行代码(没有注释!)并且没有 final
参数……完美的混乱……
接受的答案的海报说了,这里有更多细节和一个很好的理由。
所以我刚开始使用 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
class 创建一个私有构造函数并将默认参数设置为最终参数?
对于像您的 Main class 这样的 Utility classes,最好创建一个私有构造函数,以免让 java 编译器自己编写默认的无参数构造函数Main()
.
Java 总是在将参数发送到方法之前复制参数。这里的 final 关键字仅表示在方法内部不能重新分配变量。 (请注意,如果您有像您的情况那样的最终对象 String[]
,您仍然可以更改对象的属性)。
第 1 期已回答 here and is documented here。简短的回答是,您没有向 HelloWorld
class 提供任何实例成员,那么为什么允许他们创建实例呢?这就是为什么建议创建一个 private
构造函数。
第 2 期 - 说明 here。简短回答 - 在方法算法执行期间更改参数值可能会造成混淆,应该避免。这就是为什么建议声明它们 final
您可能需要至少创建一个私有构造函数,添加:
/**
* Private default constructor
*/
private HelloWorld () {
}
那应该会成功。这里的原因是因为 Java 编译器 "thinks" 你想制作一个实用程序 class 因为它只看到 public 静态方法。在这种情况下,最好的做法是拥有一个私有默认构造函数。
对于此 "Hello World" 示例,这样做很好。但是在 RL 代码中,你想从你的 HelloWorld
class 创建一个实例,然后向它添加一个 "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
即可编译,但会警告您更改了参数。这会导致意想不到的副作用,即(稍后在较大的项目中)方法更改了一些参数 "somewhere".
试想一下:+200k 行代码(没有注释!)并且没有 final
参数……完美的混乱……
接受的答案的海报说了,这里有更多细节和一个很好的理由。