[英]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.