簡體   English   中英

Java:將新的 Class 傳遞給構造函數

[英]Java: passing a new Class to a Constructor

我是 Java 的新手,只是嘗試了一些可行的方法,但我並不完全理解。

public void test(){
    Employee employee = new Employee(new Date(1,2,1990));
}

我正在調用 Employee 的構造函數,然后將新的 Class 作為參數傳遞並調用它的構造函數。 這個叫什么? 我無法找到有關此的任何信息,並想了解這里實際發生的情況。

更多細節:我的第一個努力是創建一個 Date class 的實例,然后將 object 作為參數傳遞,但為了節省代碼和 memory 我決定嘗試這個。 它按我的預期工作,但我想了解 object 的生命周期,並知道這樣做是否有任何缺點?

謝謝@hfontanez! 搜索“匿名參考”幫助我找到了一些相關信息。 但是沒有太多可以解釋的。

您正在使用 'Date' 的實例調用 'Employee' 的構造函數,同時創建日期的實例意味着您正在使用 1,2,1990 調用 'Date' 的構造函數。

這會做同樣的事情(我認為這就是你的意思):

public void test() {
    // Create an instance of 'Date' by passing the arguments '1', '2' and '1990' to the constructor of 'Date'.
    Date date = new Date(1,2,1990);

    // Create an instance of 'Employee' by passing the argument 'date' to the constructor of 'Employee'.
    Employee employee = new Employee(date);
}

這與您發布的代碼之間的唯一區別是您沒有將創建的 object 存儲在您的代碼中。

所以你不能像date.doAnything那樣稱呼它。

唯一的區別是您在測試方法中沒有對 Date object 的引用,因此您將無法在測試方法中對其進行任何操作。 除了將它傳遞給 Employee object 之外,您似乎不需要對它做任何事情,所以沒有理由不這樣做。 它不會影響 Employee object 將能夠使用它的方式,因為 Employee object 不知道或關心 Date 參數是從變量傳遞還是匿名傳遞。

此代碼創建一個新日期 object 並將其作為參數傳遞給 Employee class 的構造函數。 日期 object 可供以后使用。

public void test(){
    Date date = new Date(1,2,1990);
    Employee employee = new Employee(Date);
}

此代碼將對日期 class 的匿名引用作為參數傳遞給 Employee class 的構造函數。 因此沒有創建日期 object,以后也不能使用。

public void test(){
    Employee employee = new Employee(new Date(1,2,1990));
}

使用各種詞來描述代碼的各個方面。 正如您有一個Employee object 的實例化一樣,您也有一個設計不良且早已過時的Date class 的 object 的實例化。 實例化的結果是對新創建的 object 的引用。 Employee的情況下,您將此引用分配給一個變量,從而給它一個名稱。 由於您沒有對Date引用執行此操作,因此其他人將其稱為匿名引用是正確的。 它被傳遞給Emplouee構造函數,用於為構造函數的參數賦值,因此在構造函數內部它不再是匿名的。

優點和缺點

你說

…為了節省代碼和 memory 我決定嘗試這個。

嘗試不同的選項並查看哪些有效,哪些無效,以及您認為最清楚地表達了您的意圖並且更具可讀性是很好的(對於其他讀者,以及在您忘記所有內容后 6 個月再次訪問此代碼時的您自己)它)。 您幾乎沒有保存任何 memory。 編譯器通常足夠聰明,無論您如何編寫代碼,都不會使用過多的 memory。 我的觀點是:保存代碼不應該是一個目標。 您的目標是編寫清晰、可讀和可維護的代碼,而不是編寫少量代碼。 有時兩個 go 手牽手,因為經常閱讀更少的代碼比閱讀更多的代碼更容易。 在您的情況下,一個明顯的缺點就是您沒有給日期命名。 如果您將日期分配給名為birthDate的變量,您將告訴讀者這是員工的出生日期。 如果變量被稱為hireDate ,我們又知道了。 根據您的代碼,我們不知道員工與日期之間的關系是什么。

java.time

您的代碼的現代和推薦版本將是

Employee employee = new Employee(LocalDate.of(1990, Month.FEBRUARY, 1));

LocalDate.of()是一個工廠方法,它創建一個新的LocalDate object。 它通過在幕后某處調用帶有new的構造函數來實現。

只是為了強調您使用的Date構造函數有多么令人困惑,當我在亞洲/加爾各答時區運行您的代碼時,它創建了一個Date of Sat Aug 11 00:00:00 IST 1906。不要問為什么。 只需停止使用該構造函數並完全停止使用Date

鏈接: Trail:日期時間(Java™ 教程)解釋如何使用 java.time。

暫無
暫無

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

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