这是我在许多项目中所做的,以便能够定义一个“接口”,它定义的不是字段而是字段的“合同”。
本主题前面提出的使用abstract 基类的建议有一个严重的限制。一个具体的类可以在Java有限的多重继承形式中实现多个接口,但是……它只能extend一个基类。这意味着基类方法仅适用于一个需要字段协定的接口。
以用例的方式,假设我想要一个用于几种域对象的合约/接口:
- 有过期日期的对象
- 带有审计跟踪的对象(创建者、创建日期......)
我可能有可以过期但不需要审计跟踪的对象。我可能有其他相反的对象:它们需要审计跟踪,但没有到期日期。
基类不允许在其中进行某种“挑选”。任何基类都必须定义两者,或者您必须为所有组合都有基类。
这是我的解决方案,效果很好:我将 setter 和 getter 定义为接口中的抽象方法。您将实现留给具体的类。
public interface Auditable<USER_TYPE> {
Instant getCreatedOn();
void setCreatedOn(Instant)
USER_TYPE getCreatedBy();
void setCreatedBy(USER_TYPE creator);
Audtiable(使用String 识别用户)和 Expirable 的具体类看起来像这样(我正在使用 Lombok)
@Getter @Setter
public AuditableExpirableObject implement Auditable<String>, Expirable {
private String createdBy
private Instant createdOn;
private Instant expirationDate;
这允许具体对象选择他们使用的接口。您确实必须定义字段,但在具体类型中定义它们但实现接口的合同通常是一件“好事”。一个例子就是允许每个具体类确定如下内容:
- 数据类型(如
Auditable 的用户类型)
- 用于持久化或序列化的注解(Hibernate、JPA、Jackson、Gson 等)
- 自定义初始化或保护级别