Я пытаюсь следовать код-интерфейсу в проекте. Должен ли я сначала создавать интерфейс, а затем реализовывать этот интерфейс для классов сущностей? Я думаю, что это может зайти слишком далеко в сторону первого подхода, и сущности следует игнорировать. Это то, что я имею в виду...
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);
}
}




Я думаю, что создание интерфейсов для сущностей, вероятно, не нужно.
Цель создания интерфейсов (или, по крайней мере, одна из целей) - упростить замену одной конкретной реализации на другую. Очевидно, что это хорошо для ваших DAO, бизнес-логики и т. д.
Но если у вас нет планов по изменению реализации ваших сущностей, я бы этого избегал!
В вашем примере вы, вероятно, зашли слишком далеко, но как только вы добавите методы, напишете тестовые примеры и, возможно, используете инъекцию зависимостей, это будет иметь больше смысла.
Для таких простых проектов, как этот, это перебор, но как только вы попадаете в «настоящее» приложение, это часто оказывается хорошей идеей. Только будьте осторожны, не переусердствуйте, все не обязательно для реализации интерфейса, только там, где это имеет смысл.
Я думаю, что когда вы говорите о сущностях, это, наверное, излишество.
Интерфейсы полезны, когда вы работаете с объектами, которые имеют общее использование, но не обязательно одинаковы. Не могу придумать, как это объяснить, но вот пример:
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#, но язык не имеет значения. Интерфейсы предназначены для «совместимости с разъемами».
Это также значительно усложняет простое создание нового адреса, поскольку теперь вам требуется фабрика, чтобы скрыть реализацию.