2012-01-24 2 views
3

Например, у меня есть класс сущностей 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 класс.

мммм, звук хороший :)

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

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

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

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

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

Спасибо.

ответ

5

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

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

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

2

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

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

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

1

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