Какой принцип SOLID нарушается в следующем коде?

Какой принцип SOLID нарушается в следующем коде?

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

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

Я думаю, что LSP (принцип подстановки Лискова) нарушается, потому что подкласс B нельзя подставить в переменную типа A. Я действительно не уверен в этом, и мне почему-то кажется, что ни один из принципов SOLID здесь не нарушен.

Еще одна вещь, о которой я подумал, это то, что i объявлен без модификатора доступа. Это должно быть нарушением? Если да, то какое нарушение?

Этот вопрос не по теме, и вы не должны задавать вопросы такого рода на Stack Overflow. Проверьте Как написать минимальный, полный и проверяемый пример. Попробуйте спросить здесь: cs.stackexchange.com

Soutzikevich 08.04.2019 20:15
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
1
2 318
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В чем проблема не объявлять i приватным?

Из эффективного Java 3-го издания:

If a class is accessible outside its package, provide accessor methods to preserve the flexibility to change the class’s internal representation. If a public class exposes its data fields, all hope of changing its representation is lost because client code can be distributed far and wide.

However, if a class is package-private or is a private nested class, there is nothing inherently wrong with exposing its data fields.

Я думаю, что это довольно ясно показывает, когда нужно выставлять i, а когда нет.

С другой стороны, LSP не нарушается, потому что вы всегда можете написать

A a = new B();

Как правило, нецелесообразно оценивать, какой из принципов SOLID нарушается с помощью классов, значение которых неясно (например, классы A и B в вашем случае)

Но если вы знаете (контекстное) значение каждого класса, мы можем сделать некоторые комментарии. (Например, Employeeis-aPerson, а также Studentis-aPerson - так что LSP должен работать здесь - вы должны иметь возможность назначать объект Employee ссылке Person, и то же самое относится и к объекту Student)

@Nff, почему бы тебе не принять ответ, если он имеет смысл?

deHaar 09.04.2019 10:27

@deHaar извините, я ждал других ответов. Я принял это только сейчас.

Nfff3 09.04.2019 10:42

Другие вопросы по теме