2017-09-20 199 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可以防止现有数据的可变性,你可能仍然得到可变的子类。