Java 为什么只有使用静态方法的类才会出现错误:“quot;添加私有构造函数以隐藏隐式公共构造函数;?

Java 为什么只有使用静态方法的类才会出现错误:“quot;添加私有构造函数以隐藏隐式公共构造函数;?,java,Java,使用Java。下面是一个包含2个方法的程序,这些方法在另一个类程序中调用,该类程序具有main(这证明非静态方法需要首先创建对象)HasAStaticMethod有一个橙色SonarLint错误。为什么类NotStatic也没有错误 public final class Test { private Test () { } } class HasAStaticMethod { //private HasAStaticMethod(){} publi

使用Java。下面是一个包含2个方法的程序,这些方法在另一个类程序中调用,该类程序具有
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不建议这样做。