Java 为什么只有使用静态方法的类才会出现错误:“quot;添加私有构造函数以隐藏隐式公共构造函数;?
使用Java。下面是一个包含2个方法的程序,这些方法在另一个类程序中调用,该类程序具有Java 为什么只有使用静态方法的类才会出现错误:“quot;添加私有构造函数以隐藏隐式公共构造函数;?,java,Java,使用Java。下面是一个包含2个方法的程序,这些方法在另一个类程序中调用,该类程序具有main(这证明非静态方法需要首先创建对象)HasAStaticMethod有一个橙色SonarLint错误。为什么类NotStatic也没有错误 public final class Test { private Test () { } } class HasAStaticMethod { //private HasAStaticMethod(){} publi
main
(这证明非静态方法需要首先创建对象)HasAStaticMethod
有一个橙色SonarLint错误。为什么类NotStatic
也没有错误
public final class Test {
private Test () {
}
}
class HasAStaticMethod {
//private HasAStaticMethod(){}
public static void myPrint(String s) {
System.out.println(s);
}
}
class NotStatic {
public void myPrint(String s) {
System.out.println(s);
}
}```
为什么只有使用静态方法的类才会出现错误:“添加一个私有构造函数以隐藏隐式公共构造函数”
创建HasStaticMethod
的实例将是程序员的错误,因为它(几乎)没有任何用处。。。也是有害的(见下文)
声明私有构造函数将导致程序员错误(即错误地实例化HasStaticMethod
)被标记为编译错误
这是件好事
为什么类NotStatic也没有错误
public final class Test {
private Test () {
}
}
class HasAStaticMethod {
//private HasAStaticMethod(){}
public static void myPrint(String s) {
System.out.println(s);
}
}
class NotStatic {
public void myPrint(String s) {
System.out.println(s);
}
}```
因为您需要NoStatic
的一个实例,以便调用NoStatic.myPrint
。因此,您需要一个非私有构造函数来创建实例。默认构造函数将执行。。。因为那将是公开的
NoStatic.myPrint(); // compilation error
new NoStatic().myPrint(); // OK
在HasStaticMethod
案例中不需要实例。正确的使用方法是:
HasStaticMethod.myPrint(); // OK
你可以这样写:
new HasStaticMethod().myPrint(); // compiles ... but bad
。。。但它并不像读者(很可能)认为的那样。类的实例化是毫无意义的,通过实例引用调用静态方法完全是误导。这就是IDE提示背后的原因:阻止程序员(使用您的HasStaticMethod
类的程序员)意外或故意编写此类胡说八道
我想你可能从错误的角度考虑这个问题。目标是编写1)可以工作,2)可以由其他人读取和维护的Java代码。为此,当IDE/声纳警告我们正在做一些容易导致问题的事情时,这是一件好事。(事实上,这就是我们使用声纳等工具的原因。) 现在,如果您不喜欢,可以随意调整声纳设置来关闭此警告。或者干脆停止使用声纳。(但首先要与你的同事和经理核实一下,因为他们可能对这一行动有一些意见。) 但我的建议是只添加
private
构造函数,并将实用程序类声明为final
。。。正如声纳显示的那样。在我看来,这是一件好事
1-这不应涉及“言论自由”或“个人选择”。这不是诗意…而给出提示的原因是创建
HasStaticMethod
的实例将是程序员的错误。。。因为它几乎没有什么用处。private
构造函数用于将错误标记为编译错误。另请参见:,依此类推。因为调用NoStatic.myPrint
需要NoStatic
的实例。(在HasStaticMethod
的情况下,您不需要这样做。当然,您可以编写new HasStaticMethod().myPrint()
…但是它并没有做您可能认为它做的事情。类的实例化是毫无意义的,并且具有误导性的。这就是IDE提示背后的原因。)您从错误的角度考虑这一点。我们的目标是编写能够工作、能够读取和维护的Java代码。。。是别人干的。为此,当IDE警告我们正在做一些容易导致问题的事情时,这是一件好事。NonStatic
中的私有构造函数会阻止您使用该类。正是因为该方法是非静态的。没有人会想要那样。因此,声纳建议创造一个将是一个非常坏的主意。因此,Sonarint不建议这样做。