繁体   English   中英

为什么只有使用 static 方法的 class 会出现错误:“Add a private constructor to hide the implicit public one.”?

[英]Why does only the class with the static method have the error: “Add a private constructor to hide the implicit public one.”?

使用 Java。 下面是一个包含 2 个方法的单个程序,这些方法在另一个具有main的 Class 程序中调用(这证明了非静态方法需要先创建对象)。 HasAStaticMethod有一个橙色的 SonarLint 错误。 为什么 class 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);
    }
}```

为什么只有使用 static 方法的 class 会出现错误:“Add a private constructor to hide the implicit public one.”?

创建HasStaticMethod的实例将是程序员的错误,因为它可以(几乎)没有用处......以及有害的用途(见下文)。

声明私有构造函数将导致程序员错误(即错误地实例化HasStaticMethod )被标记为编译错误。

这是一件好事


为什么 class NotStatic 也没有错误?

因为您需要一个NoStatic实例才能调用NoStatic.myPrint 所以你需要一个非私有的构造函数来创建实例。 默认构造函数会做......因为那将是公共的。

NoStatic.myPrint();              // compilation error
new NoStatic().myPrint();        // OK

HasStaticMethod案例中不需要实例。 正确的使用方法是:

HasStaticMethod.myPrint();       // OK

你可以这样写:

new HasStaticMethod().myPrint(); // compiles ... but bad

...但它并没有像读者(很可能)认为的那样。 class 的实例化是毫无意义的,通过实例引用调用 static 方法完全是误导。 这就是 IDE 提示背后的原因:阻止程序员(正在使用您的HasStaticMethod类)意外或故意编写这种废话。


我想你可能从错误的角度思考这个问题1 目标是编写 Java 代码,1)可以工作,2)可以被其他人阅读和维护。 为此,当 IDE / Sonar 警告我们我们正在做一些可能导致问题的事情时,这是一件好事。 (事实上,这就是我们使用声纳等工具的原因。)

现在,如果您不喜欢它,您可以随意调整声纳设置来关闭此警告。 或者完全停止使用声纳。 (但请先咨询您的同事和经理,因为他们可能对这一行动方案有一些意见。)

但我的建议是添加private构造函数并将实用程序 class 声明为final ... 正如 Sonar 所建议的那样。 这是(IMO)一件好事。


1 - 这不应该是关于“言论自由”或“个人选择”。 这不是诗...

暂无
暂无

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

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