以下代码违反了哪种SOLID原则?

时间:2019-04-08 17:55:58

标签: java oop solid-principles

以下代码违反了SOLID原则?

public class A {
  void hello(){
    //some code here
  }
}

public class B extends A {
  int i;
  void hello(){
    i++;
  }
}

我认为违反了LSP(Liskov替换原理),因为子类B无法替换为类型A的变量。我对此确实不确定,因此我认为这里没有违反SOLID原则。

我一直在考虑的另一件事是声明i时没有任何访问修饰符。应该违反吗?如果是,哪个违规?

1 个答案:

答案 0 :(得分:3)

不声明i为私人有什么问题?

从有效Java第三版开始:

  

如果可以在包外部访问类,请提供访问器方法,以保留更改类内部表示形式的灵活性。如果公共类公开其数据字段,则将失去所有更改其表示形式的希望,因为客户端代码可以分散分布。

     

但是,如果一个类是程序包私有的或私有嵌套的类,则公开其数据字段没有本质上的错误。

我认为很清楚何时需要公开i,何时不公开。

另一方面,不违反LSP,因为您可以随时写入

A a = new B();

通常不宜使用含义不明确的类(例如您的情况下的类AB)来评估哪些SOLID原则被违反了

但是,如果您知道每个类的(上下文)含义,那么我们可以提出一些意见。 (例如,Employee is-a Person以及Student is-a Person-因此LSP应该在这里工作-您应该能够分配Employee对象到Person引用的地方,Student对象也有类似的事情)