簡體   English   中英

在java中使用final

[英]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變量不能在任何地方重新分配,但如果它是公共的,則另一個類仍然可以訪問引用並更改它指向的任何對象的值。

如果您不希望在初始化之后重新分配變量,請使用finalprivate


使用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是對象的引用,而不是基本類型。

  1. public final type attribute_name表示不能重新分配attribute_name以引用其他內容。 但是attribute_name 用於調用更改其狀態的方法。

  2. private type attribute_name ,只有類中的方法可以調用attribute_name方法。

因此,如果您希望它保持不變,請使用方法(2)。 public方法限制為最終調用attribute_name上不修改其狀態的方法的方法。

暫無
暫無

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

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