2017-08-01 55 views
3

所以我對使用checkstyle和我簡單的HelloWorld java程序很陌生,我收到很多我不明白的錯誤。Java Hello World通過CheckStyle

我的代碼:

package <package_name>; 

/** 
* A simple class to compile. 
*/ 
public class HelloWorld { 

/** 
    * @param args standard main parameters 
    */ 

    public static void main(String[] args) { 
     System.out.println("hello world"); 
    } 
} 

我收到的錯誤:

Line 6: Utility classes should not have a public or default constructor 
Line 10: Parameter args should be final 

爲什麼會發生這種情況?是否有必要爲我的main類創建一個私有構造函數並使默認參數成爲最終的?

回答

4

對於像Main類這樣的實用程序類,最好創建一個私有構造函數,以便不讓java編譯器將其自身寫入默認的無參數構造函數Main()

Java在將參數發送給方法之前,始終會複製這些參數。這裏的final關鍵字只意味着在方法內部變量不能被重新分配。 (請注意,如果您的最終對象像您的案例String[]一樣,您仍然可以更改對象的屬性)。

2

第一個問題回答了here,並記錄在here。簡單的答案是你沒有提供任何實例成員到HelloWorld類,那麼爲什麼讓他們創建實例呢?這就是爲什麼建議創建一個private構造函數。

第2期 - 陳述爲here。簡答 - 在執行方法的算法期間更改參數的值可能會造成混淆,應該避免。這就是爲什麼它被推薦申報他們final

1

可能需要創建至少一個私有構造函數,補充一點:

/** 
* Private default constructor 
*/ 
private HelloWorld() { 
} 

這應該讓它走。這是因爲Java編譯器「認爲」你想製作一個實用程序類,因爲它只能看到公共靜態方法。在這種情況下,最好的做法是擁有一個私有的默認構造函數。

對於這個「你好世界」的例子,這樣做很好。但在RL代碼中,您想從HelloWorld類創建一個實例,然後向其添加一個「業務」方法(包含您的邏輯的方法)。

編輯:在第10行警告是一個很好的,如使用final在一般方法的參數,你不能更改參數的值:

public class Foo { 
    public Foo() { 
    } 

    public void doBar (final Bar bar) { 
     // Won't work: 
     bar = null; 

     // Will work! 
     bar.callMe(); 
    } 
} 

public class Bar { 
    public Bar { 
    } 

    public void callMe() { 
     // Do something 
    } 
} 

現在只需刪除該final它將編譯但向你發出警告,說明你改變了一個參數。這會導致意想不到的副作用,(稍後在較大的項目中)方法已將某些參數更改爲「某處」。

只是試着想象:+ 200K行代碼(無評論!),並沒有final的參數......一個完美的混亂......

接受的答案的海報說,這裏只是更多的細節和好理由。