【发布时间】:2015-04-25 05:54:27
【问题描述】:
在 Java 8 中使用 默认方法作为特征的穷人版本是否安全?
Some claim it may make pandas sad 如果您只是为了它而使用它们,因为它很酷,但这不是我的意图。人们还经常提醒,引入默认方法是为了支持 API 演变和向后兼容性,这是事实,但这并不会导致将它们用作特征本身是错误或扭曲的。
我想到了the following practical use case:
public interface Loggable {
default Logger logger() {
return LoggerFactory.getLogger(this.getClass());
}
}
或者,定义一个PeriodTrait:
public interface PeriodeTrait {
Date getStartDate();
Date getEndDate();
default isValid(Date atDate) {
...
}
}
诚然,可以使用组合(甚至是辅助类),但它看起来更加冗长和混乱,并且不允许从多态中受益。
那么,使用默认方法作为基本特征是否可以/安全,还是我应该担心不可预见的副作用?
Several questions 上的 SO 与 Java 与 Scala 特征有关;这不是重点。我也不仅仅是征求意见。相反,我正在寻找一个权威的答案或至少是现场洞察力:如果您在公司项目中使用默认方法作为特征,那么它会变成定时炸弹吗?
【问题讨论】:
-
在我看来,您可以从继承抽象类中获得相同的好处,而不必担心让 pandas 哭泣......我可以看到在接口中使用默认方法的唯一原因是你需要这个功能并且不能修改一堆基于接口的遗留代码。
-
我同意@infosec812 关于扩展定义自己的静态记录器字段的抽象类。您的 logger() 方法不会在每次调用时都实例化一个新的记录器实例吗?
-
对于日志记录,您可能需要查看 Projectlombok.org 及其@Slf4j 注释。
标签: java java-8 traits default-method