Правильный дизайн для классов сущностей.Нужны рекомендации - PullRequest
3 голосов
/ 24 января 2012

Например, у меня есть класс сущности User:

public class User
{
  private long id;
  private String name;

  // setters and getters
}

Далее я добавляю новый класс сущности: Comment

public class Comment
{
private long id;
private String comment;

// setters and getters
}

Далее я могу добавить еще ибольше классов сущностей.

И в этот момент я думаю: я могу / должен связать / соединить в логической структуре свои классы сущностей или нет?

Что я имею в виду?Я пытаюсь объяснить:

Точка 1: Все эти классы: User, Comment и другие - POJO.

Идея 1: Нужна логическая привязка для этих классов через интерфейс илиабстрактный класс.

Пункт 2: Я вижу, что все классы сущностей имеют одинаковые методы: getId и setId().

Идея 2: Необходимо избегать объявления этого метода во всех классах.

Мое решение:

Добавить интерфейс BaseEntity:

public interface BaseEntity
{
public long getId();
public void setId(long id);
}

Добавить все классы сущностей, которые должны реализовывать этот интерфейс.

В результате мы получаем логическое соединениевсе классы сущностей.И мы гарантируем, что каждый класс сущностей реализует методы getId() и setId().

Но это решение не решает проблему с множественным объявлением getId и setId.

Решениезаключается в создании общего класса BaseEntity:

    public class BaseEntity
    {
      private long id;
      public long getId() {return this.id};
      public void setId(long id) {this.id = id;};
    }

И весь класс сущностей должен расширять класс BaseEntity.

мммм, звучит неплохо:)

Но, с текущей реализацией - пользовательможно создать экземпляр BaseEntityClass. Это имеет смысл?Могу ли я дать возможность создать класс BaseEntity?

Или, может быть, хорошим решением пометить этот класс как abstract?Как вы думаете?

И если вы согласны со всеми моими предыдущими шагами:

У меня последний вопрос:

Связь между классами должна основываться на интерфейсах.Но у меня нет интерфейса для сущностей.Это может создать проблемы для меня в будущем?

Спасибо.

Ответы [ 3 ]

5 голосов
/ 24 января 2012

Да, сделайте вашу базовую сущность абстрактным классом, и пусть другие расширяют его.

public abstract class BaseEntity
    {
       private long id;
       public long getId() {return this.id};
       public void setId(long id) {this.id = id;};
    }

Как правило, всегда следует программировать на интерфейс, а не на реализацию.

2 голосов
/ 24 января 2012

Вы можете использовать абстрактный класс BaseEntity, сопоставленный с @MappedSuperclass.Но вам все равно придется переопределить сопоставление поля идентификатора с соответствующим столбцом в каждом подклассе.

То, что два класса имеют одно и то же свойство, не обязательно означает, что они должны расширять общий класс.Ваш код, вероятно, никогда не будет ссылаться на какой-либо объект с типом BaseEntity.Если у вас нет дополнительных распространенных методов, я бы посоветовал не использовать суперкласс в этом случае.Это будет просто.

А сущности - это POJO.Использование интерфейса для каждой сущности, по моему опыту, просто добавляет ненужную сложность.

1 голос
/ 24 января 2012

Сделать абстракцию BaseEntity очень хорошо, я сам так использовал.И я не думаю, что есть что-то еще, что вы можете абстрагировать.Вы можете абстрагироваться, если у вас будет несколько таблиц, у всех из которых есть общие столбцы, например, для целей аудита.А интерфейсы для сущностей?Я не думаю, что это что-то полезное.Интерфейс более полезен, когда вам нужно переключать различные реализации, теперь уже в сущностях, что не имеет особого смысла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...