Java:私有方法与最终方法 class

Java : private method vs final class

我在java研究不变性时遇到了这个问题。据说为了使 class 不可变,class 应该声明为 final 以便它的方法不能被扩展。我有一个问题,如果我在 java 中将方法标记为 private 或方法 final,我可以实现相同的效果。如果我这样做,我不必将 class 标记为最终的。我得到这个正确的。高度赞赏您对此的想法。

A final class in Java 无法被子classed。这意味着,根据定义,它的方法不能被重载,也不能向 class 添加新方法(行为)。另一方面,如果你要标记 class final 的所有方法,那么它意味着不同的东西。 final 方法不能被覆盖或隐藏。但是,单独标记所有方法 final 仍然允许 class 被子class 编辑并向其添加新的 methods/behaviors。

允许覆盖不可变数据class也允许添加可变数据。

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

因此,虽然将您的方法设置为 final 可能会阻止现有数据的可变性,但您仍然可以获得可变子 classes。

没有 public 变异方法或字段的非最终 class 的事情是你仍然可以子class 它。

假设你有这个不可变的 class:

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

    // constructors
}

这个 class 没有 public 可变方法或字段,但它不是最终的,所以其他人仍然可以子class 它以使其可变:

class MyPoint extends Point {
    public int foo;
}

现在您突然可以随意更改 foo 的值了。 MyPoint 现在变得可变了!

这就是为什么你应该将不可变 class 标记为最终的。