2017-09-20 24 views
0

我在Java中學習不變性時遇到了這個問題。據說爲了使一個類不可變,這個類應該被聲明爲final,這樣它的方法就不能被擴展。我有這樣一個問題,如果我在java中標記私有方法或方法final,我可以達到相同的效果。如果我這樣做,我不必把班級標記爲最終的。我得到這個正確的。你對此的看法高度讚賞。Java:私有方法vs最終類

+0

這個問題本身解釋什麼是目標*是爲了使一個類不可變*而不是使方法不被重寫。 – nullpointer

+0

如果您在子類中添加新的方法和字段@kltis – VedX

回答

1

非終極類沒有公共變異方法或字段的事情是,你仍然可以繼承它的子類。

說你有這樣的不可變類:

class Point { 
    private int x, y; 
    // getters 

    // constructors 
} 

該類沒有公共誘變方法或字段,但它不是最終的,所以其他人還可以繼承它,使其變更:

class MyPoint extends Point { 
    public int foo; 
} 

現在突然間,您可以根據需要更改foo的值。 MyPoint現在變得可變!

這就是爲什麼你應該將不可變類標記爲final。

4

A final Java中的類不能被子類化。這意味着,根據定義,其方法不能重載,也不能向類中添加新的方法(行爲)。另一方面,如果你要標記一個類final的所有方法,那麼它意味着不同的東西。方法不能被覆蓋或隱藏。但是,單獨標記所有方法final仍然可以將該類繼承爲子類,並將新方法/行爲添加到該類中。

1

允許重寫一個不可變的類也允許添加可變數據。

class SuddenlyMutableString extends String { 
    private int id; 
    public int getId() { return id; } 
    public void setId(int i) { id = i; } 
} 

所以當你的方法設置final可以防止現有數據的可變性,你可能仍然得到可變的子類。