所以我刚开始使用校验风格,对于我的简单的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类创建一个私有构造函数并使默认参数成为最终参数?
发布于 2017-08-01 20:33:30
对于像您的主类这样的实用程序类,最好创建一个私有构造函数,这样就不会让java编译器自己编写默认的no构造函数Main()。
Java总是在将参数发送到方法之前复制它们。这里的最后一个关键字只意味着方法中的变量不能重新分配。(请注意,如果有最后一个对象,如String[],则仍然可以更改对象的属性)。
发布于 2017-08-01 20:37:17
第一个问题被这里回答,并被记录为这里。简而言之,您没有向HelloWorld类提供任何实例成员,那么为什么允许他们创建实例呢?这就是为什么建议创建private构造函数的原因。
第二期--声明为这里。简短的答案--在执行该方法的算法时更改参数的值可能会引起混淆,应该避免。这就是为什么建议声明它们为final的原因
发布于 2017-08-01 20:43:46
您可能需要至少创建一个私有构造函数,添加以下内容:
/**
* Private default constructor
*/
private HelloWorld () {
}那会让它消失的。之所以如此,是因为Java编译器“认为”您想要创建一个实用程序类,因为它只看到公共静态方法。在这种情况下,最好的做法是拥有一个私有的默认构造函数。
以"Hello“为例,这样做是可以的。但是在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,它就会编译,但会向您抛出更改参数的警告。这会产生意想不到的副作用,即(稍后在较大的项目中)方法更改了“某个地方”的一些参数。
试想一下:+200 k行代码(没有注释!)参数没有final ..。一个完美的混乱..。
被接受的答案的海报上写着,只是更多的细节和一个很好的理由。
https://stackoverflow.com/questions/45447138
复制相似问题