Java 使用继承在我的域层中添加字段
我创建了一个名为Java 使用继承在我的域层中添加字段,java,Java,我创建了一个名为Base的类,该类有一个字段存储UUID,因为我希望系统中的所有对象都具有该字段。我还希望在数据库中可以存储的所有对象上都有一个名为id的字段。我不会将其添加到Base,因为并非我的域层中的所有对象都会持久化到数据库中。我可以创建另一个从Base继承的类,并添加此字段,然后让所有需要同时从该字段继承的类 是否应该避免为了添加这样的字段而创建层次结构?有更好的选择吗?继承就是为了本地化许多不同类之间常见的类属性/行为。您的示例非常简单,但似乎仍然合理地使用了继承。如果id所做的只是
Base
的类,该类有一个字段存储UUID
,因为我希望系统中的所有对象都具有该字段。我还希望在数据库中可以存储的所有对象上都有一个名为id
的字段。我不会将其添加到Base
,因为并非我的域层中的所有对象都会持久化到数据库中。我可以创建另一个从Base
继承的类,并添加此字段,然后让所有需要同时从该字段继承的类
是否应该避免为了添加这样的字段而创建层次结构?有更好的选择吗?继承就是为了本地化许多不同类之间常见的类属性/行为。您的示例非常简单,但似乎仍然合理地使用了继承。如果id所做的只是提供简单的get/set,那么我将使用一个接口:IDbEntity,该接口包含getId()和setId()等方法。对于非常简单的应用程序,您只能使用继承。但随着应用程序变得越来越复杂,如果使用组合,则类将变得更加灵活。因此,在接口中定义公共行为和公共字段,并要求具有这些公共行为的类来实现它们。为公共接口提供实现,并让您的类将调用委托给实现类 以下是一个例子:
interface Uniqueness {
long getUUID();
void setUUID(long uuid);
}
interface Storable {
long getId();
void setId(long id);
}
class UniquenessSupport implements Uniqueness {
private long uuid;
@Override
public long getUUID() {
return uuid;
}
@Override
public void setUUID(long uuid) {
this.uuid = uuid;
}
}
class StorableSupport implements Storable {
private long id;
@Override
public long getId() {
return id;
}
@Override
public void setId(long id) {
this.id = id;
}
}
class Some implements Uniqueness, Storable {
private UniquenessSupport uniquenessSupport;
private StorableSupport storableSupport;
public Some() {
uniquenessSupport = new UniquenessSupport();
storableSupport = new StorableSupport();
}
@Override
public long getUUID() {
return uniquenessSupport.getUUID();
}
@Override
public void setUUID(long uuid) {
uniquenessSupport.setUUID(uuid);
}
@Override
public long getId() {
return storableSupport.getId();
}
@Override
public void setId(long id) {
storableSupport.setId(id);
}
}
在这个简单的例子中,有很多样板代码,但当您向类中添加更多字段和方法时,这是具有灵活性并避免代码重复的唯一方法。如果您有更多的接口,比如:payment
,Sendable
,Returnable
,并希望创建一个新类,该类仅为payment
,且具有唯一性
,您使用合适的接口和支持类:唯一性
+唯一性支持
和应付
+仅支付支持
另一方面,如果使用继承,您将扩展一些基类,这些基类将需要包含来自
payment
、Sendable
等的所有方法,以满足所有需求,但您的类只需要payment
,并且具有唯一性。通过继承,您将使其也可返回
,可存储
,等等。您可能会选择使用接口,并需要getUUID()
方法(以及用于DB序列化对象的getDatabaseId()
方法),但如果equals和hashCode基于uuid,则我需要该类,我还希望为所有具有id
字段的对象提供一个isNew()
方法,以检查它是否已被持久化到数据库中。但是,每个实现类仍然必须持有一个id成员。这是针对该领域中的每一个类,在java中是这样的,在没有像.NET那样的属性,并且没有C++继承的多个继承的情况下。这是一种复合,但正如我在评论中所写,它将提供更好的灵活性。在更复杂的情况下,组合可能被联合排序而不是继承,这可能无法提供足够的灵活性。假设将来会有更多的实体被持久化到文件中。它们将扩展某些DbEntity类。但是现在一个类不能同时支持db和文件。@omerschleifer-可能。我不可能涵盖这样一个特性的所有可能的路线图:)只是提到这就是继承的目的。。将公共属性/行为本地化到单亲类中。我同意您的suugestionFavor composition而不是继承:)嗯……因此,如果您创建一个名为Unique(缺少更好的名称)的接口,它需要UUID的getter和setter,还有另一个名为Storable的接口,它需要一个getter和setter作为Id,然后你必须创建两个实现类,然后你需要在每个域类中有一个字段,我猜它需要这个功能并创建另一组setter/getter,或者你仍然需要通过层次结构继承它们?请举一个例子,因为我不确定我是否理解这一点。谢谢你提供的例子,太棒了!:)