簡體   English   中英

Java Hello World傳遞CheckStyle

[英]Java Hello World to pass CheckStyle

所以我是使用checkstyle的新手,對於我簡單的HelloWorld java程序,我收到了很多我不理解的錯誤。

我的代碼:

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類創建一個私有構造函數並使默認參數最終?

對於像Main類這樣的Utility類,最好創建一個私有構造函數,以便不讓java編譯器自己編寫默認的no args構造函數Main()

在將參數發送到方法之前,Java總是復制參數。 這里的final關鍵字僅表示在方法內部無法重新分配變量。 (請注意,如果你有一個像你的情況String[]的最終對象,你仍然可以改變對象的屬性)。

第一期在這里得到解答在此處記錄 簡短的回答是,您沒有向HelloWorld類提供任何實例成員,那么為什么要允許它們創建實例? 這就是為什么建議創建private構造函數的原因。

第二期 - 在這里說明。 簡短回答 - 在執行方法算法期間更改參數值可能會造成混淆,應該避免。 這就是為什么建議將它們聲明為final

可能需要至少創建一個私有構造函數,添加:

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

這應該讓它消失。 這里的原因是因為Java編譯器“認為”你想要創建一個實用程序類,因為它只看到公共靜態方法。 在這種情況下,最好的做法是擁有一個私有默認構造函數。

對於這個“Hello World”示例,可以這樣做。 但是在RL代碼中,您希望從HelloWorld類創建一個實例,然后添加一個“business”方法(包含您的邏輯的方法)。

編輯:第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 ......完美的混亂......

接受的答案的海報說了這里,這里有更多的細節和一個很好的理由。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM