将'final'修饰符与getter和setter一起使用是一个好主意吗?

jmb*_*b95 3 java oop encapsulation access-modifiers

我想知道为什么最终修饰符不与getter和setter一起使用?

为什么这样:

private int x;

public void setX(int x) 
{ 
  if(x >= 1) throw new IllegalArgumentException("X must be lower than 1");
  this.x = x; 
}
Run Code Online (Sandbox Code Playgroud)

而不是这个:

private int x;

public final void setX(int x) 
{ 
  if(x >= 1) throw new IllegalArgumentException("X must be lower than 1");
  this.x = x; 
}
Run Code Online (Sandbox Code Playgroud)

它没有改善封装?我一直试图用谷歌澄清它,但我没有运气.

谢谢你提前.

das*_*ght 9

您可能希望离开setter非final的一个原因是让子类进行自己的,更严格的参数检查:

public class Subclass extends Superclass {
    public void setX(int x) { 
        if(x >= 0) throw new IllegalArgumentException("X must be negative");
        super.setX(x); 
    }
}
Run Code Online (Sandbox Code Playgroud)

当然这打破了Liskov替换原则,因为子类强化了子类型中的前提条件.

  • @Eran不,它不会让子类削弱检查:如果你调用`super.setX(x);`的值没有通过基数的检查,你最终会得到一个异常(反射可以让你击败支票,但反思可以让你做很多坏事,所以我不会在这里谈论它.您可以为`x`提供自己的存储空间,因为基础中的`int x`是私有的,但这通常是一件非常糟糕的事情. (2认同)
  • 这是一种可能打破Liskov替换原则的好方法......(专业)开发人员不应该这样做. (2认同)