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 标记为最终的。
我在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 标记为最终的。