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,或者你仍然需要通过层次结构继承它们?请举一个例子,因为我不确定我是否理解这一点。谢谢你提供的例子,太棒了!:)