2010-11-15 112 views
12

我正在創建一個銀行模型,並且一個Account類有一個accountNumber字段。賬號不應該改變,但我不能將字段設置爲final,因爲這會阻止構造函數設置它。我可以在聲明後做一個變量final嗎?

如果無法做到這一點,沒關係。這只是一個CS任務,所以我想確保我以最好的方式做到這一點。

最好的實現是將該字段及其setter方法設置爲私有的嗎?

+4

「這將阻止構造函數設置它。」你確定嗎? http://stackoverflow.com/questions/677595/initialize-final-variable-before-constructor-in-java – kasten 2010-11-15 21:43:35

+0

太棒了,不知道你可以這樣做:D – Matt 2010-11-15 21:46:08

+0

你不能在構造函數中改變最終的靜態變量,因爲靜態變量是許多實例的一個。但是final變量可以在構造函數中初始化。 – 2013-03-03 16:56:23

回答

23

構造函數可以如果它被標記爲final以下是合法的:

public class BankAccount { 

    private final int accountNumber; 

    public BankAccount(int accountNumber) { 
     this.accountNumber = accountNumber; 
    } 

} 

事實上,如果一個字段被標記爲final但在其聲明中,那麼它必須在所有構造函數來設置不會被初始化。

如果你沒有在課堂上放置一個公共setter,那麼賬號不能從課堂外改變,但將它標記爲final也可以防止課堂上任何方法(意外)改變它。

+1

如果你聲明私人最終字符串accountNumber = null,編譯器會抱怨。 – Todd 2010-11-15 21:46:18

+1

@Todd,正確。一旦設置爲「空」,最終的變量不能被重新分配。但是,如果聲明只是'private final String accountNumber;'那麼你可以在構造函數中賦值。 – mikej 2010-11-15 21:49:46

+0

該評論是針對提問者的。我認爲這可能是他遇到的問題。 – Todd 2010-11-15 22:05:04

4

如果一個變量是final它可以(和必須)在構造函數中初始化。

+0

因此,如果我聲明這個字段是「private final accountNumber」然後在像「accountNumber = 1234」這樣的構造函數中初始化它,這將起作用?我只能在構造函數中做到這一點? – Matt 2010-11-15 21:42:37

+0

是的。所有決賽都必須在所有構造函數中設置。 – 2010-11-15 21:43:10

+4

這不是真的,真的。最終字段可以在聲明的位置,實例初始化塊或構造函數中進行初始化。靜態最終字段可以在聲明它的位置或靜態初始化塊中初始化。 – ColinD 2010-11-15 21:58:32

相關問題