Применяется ли принцип «код-интерфейс» к классам сущностей?

Я пытаюсь следовать код-интерфейсу в проекте. Должен ли я сначала создавать интерфейс, а затем реализовывать этот интерфейс для классов сущностей? Я думаю, что это может зайти слишком далеко в сторону первого подхода, и сущности следует игнорировать. Это то, что я имею в виду...

public interface Address {
  public String getStreet();
  public void setStreet(String street);
}

@Entity
public class AddressImpl implements Address {
  private String street;

  public String getStreet(){
    return this.street;
  }
  public void setStreet(String street){
    this.street = street;
  }
}

@Entity
public class OfficeImpl /* implements Office */ {
  private Address location;

  public Address getLocation(){
    return this.location;
  }
  public void setLocation(Address location){
    this.location = location;
  }
}

public class Driver {
  public static void main(String[] args) {
    Office work = new OfficeImpl();
    Address workAddress = new AddressImpl();
    workAddress.setStreet("Main St.");
    work.setLocation(workAddress);
  }
}
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
0
924
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

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

Я думаю, что создание интерфейсов для сущностей, вероятно, не нужно.

Цель создания интерфейсов (или, по крайней мере, одна из целей) - упростить замену одной конкретной реализации на другую. Очевидно, что это хорошо для ваших DAO, бизнес-логики и т. д.

Но если у вас нет планов по изменению реализации ваших сущностей, я бы этого избегал!

Это также значительно усложняет простое создание нового адреса, поскольку теперь вам требуется фабрика, чтобы скрыть реализацию.

Robin 12.12.2008 21:56

В вашем примере вы, вероятно, зашли слишком далеко, но как только вы добавите методы, напишете тестовые примеры и, возможно, используете инъекцию зависимостей, это будет иметь больше смысла.

Для таких простых проектов, как этот, это перебор, но как только вы попадаете в «настоящее» приложение, это часто оказывается хорошей идеей. Только будьте осторожны, не переусердствуйте, все не обязательно для реализации интерфейса, только там, где это имеет смысл.

Я думаю, что когда вы говорите о сущностях, это, наверное, излишество.

Интерфейсы полезны, когда вы работаете с объектами, которые имеют общее использование, но не обязательно одинаковы. Не могу придумать, как это объяснить, но вот пример:

interface IFlaggable {
  bool IsFlagged ...
  string Reason ...
}

class ForumPost implements IFlaggable { }

class PrivateMessage implements IFlaggable { }

Надеюсь, это поможет!

Обычно я не создаю интерфейсы для bean-компонентов, содержащих данные, то есть я не создаю интерфейсы для классов со значениями примитивных типов и геттеров / сеттеров для них. На самом деле я никогда не встречал момента, когда мне понадобились бы интерфейсы для всего, для чего я их обычно использую (в основном, полиморфизм и насмешки), поэтому я не стал этим заниматься.

Думаю, я должен отметить, что большую часть времени, когда я использую компоненты данных, я также отражаю значения из тех же объектов с настраиваемыми классами, которые работают следующим образом:

Reflector r = new Reflector(new DataBean( [ values given through constructor ] ));
long someNumber = r.get("method", Long.class);

интерфейс для сущностей должен иметь поведение и свойства, общие для всех сущностей!

public interface IEntity
{
    int EntityId { get; set; }
    bool FindById(int id);
    bool Create(object [] values);
    bool Delete(int id);
    //etc.
}

извините за пример C#, но язык не имеет значения. Интерфейсы предназначены для «совместимости с разъемами».

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