【问题标题】:Java : private method vs final class [duplicate]Java:私有方法与最终类[重复]
【发布时间】:2018-03-01 02:09:03
【问题描述】:

我在学习 java 中的不变性时遇到了这个问题。据说为了让一个类不可变,这个类应该被声明为final,这样它的方法就不能被扩展。我有一个问题,如果我在 java 中将方法标记为私有或最终方法,我可以达到同样的效果。如果我这样做,我不必将课程标记为最终课程。我得到了这个正确的。您对此的想法高度赞赏。

【问题讨论】:

  • 问题本身解释了目标是为了使类不可变而不是使方法不被覆盖。
  • 如果在子类@kltis中添加新方法和字段会怎样

标签: java immutability final protected access-modifiers


【解决方案1】:

Java 中的final 类不能被子类化。这意味着,根据定义,它的方法不能重载,也不能将新方法(行为)添加到类中。另一方面,如果你要标记一个类final 的所有方法,那么它意味着不同的东西。 final 方法不能被覆盖或隐藏。但是,单独标记所有方法 final 仍然允许将类子类化并添加新的方法/行为。

【讨论】:

    【解决方案2】:

    没有公共变异方法或字段的非最终类的问题是您仍然可以对其进行子类化。

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

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

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

    class MyPoint extends Point {
        public int foo;
    }
    

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

    这就是为什么你应该将不可变类标记为 final。

    【讨论】:

    • 或将其构造函数设为私有并从父类内部的工厂方法返回。
    【解决方案3】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-11-20
      • 2021-05-10
      • 2018-05-06
      • 2010-11-27
      • 1970-01-01
      • 2015-03-14
      • 2019-04-14
      • 1970-01-01
      相关资源
      最近更新 更多