[英]Usage of final in java
我想知道它們之間有什么區別
public final type attribute_name;
和
private type attribute_name;
public type getA_name() {
return attribute_name;
}
基本上我想將屬性設置為只讀,因此在初始化后它不能改變。
我是public final
,還是將其設為private
,並且只能通過get方法訪問它(沒有set方法)?
當它不是final
而是private
,該類本身就能夠改變它的價值。
必須在構造函數退出之前設置final
字段。 設置后,無法修改引用(無法重新分配值)。 強調不能重新分配 。 這意味着雖然引用不能更改, 但值本身可以更改 。
這是合法的:
final List<Integer> list = new List<Integer>();
list.add(5); // the value of list changes, but the reference doesn't
這不是:
final List<Integer> list = new List<Integer>();
list = new List<Integer>(); // may seem sort of redundant but the compiler won't allow it nonetheless
具有唯一getter的private
變量可以由保存它的類在內部重新分配(但它在外部不可見,因此不能在持有它的類之外重新分配)。 此外,在類之外,引用是不可訪問的,因此除了持有它的類之外,不能修改變量。
final
變量不能在任何地方重新分配,但如果它是公共的,則另一個類仍然可以訪問引用並更改它指向的任何對象的值。
如果您不希望在初始化之后重新分配變量,請使用final
和private
。
使用final
來做這樣的事情:
public class User {
private final long registrationTimeMillis;
public User(/* various parameters probably would be here */) {
registrationTimeMillis = System.currentTimeMillis();
}
public long getRegistrationTimeMillis() {
return registrationTimeMillis;
}
}
我們不希望用戶的注冊時間會發生變化,所以在構建之后不允許它更改是有意義的。
對於像這樣的事情,使用private
而不使用setter:
public class VendingController() {
private int drinksStocked = 0;
private int drinksDispensed = 0;
public void dispenseDrink() {
drinksDispensed++;
}
public void stockDrinks(int numberOfDrinks) {
drinksStocked = getDrinksRemaining() + numberOfDrinks;
drinksDispensed = 0;
}
public int getDrinksRemaining() {
return drinksStocked - drinksDispensed;
}
}
除非調用stockDrinks(int numberOfDrinks)
dispenseDrink()
或stockDrinks(int numberOfDrinks)
, drinksDispensed
我們不希望drinksDispensed
的值發生變化。 當自動售貨機重新裝滿時,它仍然需要能夠由自己的班級重新分配,所以我們不應該讓它final
關於使用public final
,通常在Java中只對常量執行,並且還包括static
關鍵字,因為常量不應該依賴於實例。
使用public static final
時有意義的一個例子
public class UnitConversions {
public static final double CENTIMETERS_PER_INCH = 2.54;
}
然后可以將其用於如下方法中
public double convertFromCentimetersToInches(double centimeters) {
return centimeters / UnitConversions.CENTIMETERS_PER_INCH;
}
祝你好運OP和快樂的編碼。
final修飾符允許只分配一次字段 - 之后不能更改它,並且必須在對象構造期間(即構造函數返回之前)設置它。
如果要將字段設置為只讀,請使用信息隱藏原則:將其設置為私有並提供返回字段的公共getter(或非原始類型的字段的副本)。
你應該只使用public final
作為真正的常量。 即使你的領域因為final
不可變而仍然是一個好主意仍然是private
。
這取決於一些因素。
如果這是一個以前已知並且永遠不會改變的實常數,則使用final
。 在Java中, final
字段也可以在構造函數中初始化,因此如果您的值在構造時已知,那么您也可以使用final
。
如果在運行時期間設置此值(一次,多次),則使用private
+ getter
。
正確的方法是在未來思考。 什么可以幫助您實現目標? 也許以后你也想給這個變量一個值。 如果我是你,我會通過一個get方法創建並保持變量私有。
final
關鍵字的完整文檔: http : //en.wikipedia.org/wiki/Final_(Java)
取決於您要從哪里訪問它。 公共變量可以從項目和包中的任何類訪問,其中private只能從變量所在的類訪問。
'final'運算符使其成為永久和只讀。
我們假設type
是對象的引用,而不是基本類型。
public final type attribute_name
表示不能重新分配attribute_name
以引用其他內容。 但是attribute_name
可用於調用更改其狀態的方法。
在private type attribute_name
,只有類中的方法可以調用attribute_name
方法。
因此,如果您希望它保持不變,請使用方法(2)。 將public
方法限制為最終調用attribute_name
上不修改其狀態的方法的方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.