簡體   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