在接口中使用默认方法是否是避免代码重复的良好模式?



我们在数据持有者类中有很多代码重复,可以序列化为XML字符串:

public String toXml() throws JAXBException {
final JAXBContext context = JAXBContext.newInstance(this.getClass());
final Marshaller marshaller = context.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");
final StringWriter stringWriter = new StringWriter();
marshaller.marshal(this, stringWriter);
return stringWriter.toString();
}

为什么不将此代码移动到具有默认实现的单个接口?因此,一个简单的implements ToXmlUtf8就足以共享默认实现并避免代码重复:

public interface ToXml {
default String toXml() throws JAXBException {
final JAXBContext context = JAXBContext.newInstance(this.getClass());
final Marshaller marshaller = context.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");
final StringWriter stringWriter = new StringWriter();
marshaller.marshal(this, stringWriter);
return stringWriter.toString();
}
}

以前有人成功做到这一点吗?

其他解决方案?

我还可以想象使用注释来生成此代码。

是否有任何现成的解决方案?

是的,默认方法可以这样使用。

尽管默认方法的预期用例是在不破坏旧代码的情况下向现有接口添加新功能,但默认方法也有其他用途。默认方法也用于Java 8中添加的接口中,例如在java.util.Predicate中,因此即使是Java设计人员也认识到向现有接口添加新功能并不是默认方法的唯一有效用途。

缺点可能是实现的接口是类的公共契约的一部分,但在您的情况下,这似乎不是问题。

如果您使用的是完全相同的方法,那么接口将无济于事,您要做的是创建一个静态方法并将其放在 util 类中

最新更新