相关疑难解决方法(0)

Java 8默认方法作为特征:安全吗?

在Java 8中使用默认方法作为穷人的特征是一种安全的做法吗?

一些人声称如果你只是为了它而使用它们可能会让熊猫感到悲伤,因为它很酷,但这不是我的意图.还经常提醒的是,引入了默认方法来支持API演变和向后兼容性,这是事实,但这并不会使它们错误或扭曲以将它们用作特征本身.

我有以下实际用例:

public interface Loggable {
    default Logger logger() {
        return LoggerFactory.getLogger(this.getClass());
    }
}
Run Code Online (Sandbox Code Playgroud)

或许,定义一个PeriodTrait:

public interface PeriodeTrait {
    Date getStartDate();
    Date getEndDate();
    default isValid(Date atDate) {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

无可否认,可以使用组合(甚至是辅助类),但它看起来更冗长,更混乱,并且不允许从多态性中受益.

那么,使用默认方法作为基本特征是否可行/安全,还是应该担心不可预见的副作用?

关于SO的几个问题与Java vs Scala特征有关; 这不是重点.我也不仅仅是在征求意见.相反,我正在寻找一个权威的答案或至少是现场洞察力:如果你在公司项目中使用默认方法作为特征,那么它是否真的是一个时间炸弹?

java traits java-8 default-method

115
推荐指数
1
解决办法
1万
查看次数

Java中的抽象类与接口

我被问到一个问题,我想在这里查看我的答案.

问:在哪种情况下扩展抽象类而不是实现接口更合适?

答:如果我们使用模板方法设计模式.

我对么 ?

如果我无法清楚地陈述问题,我很抱歉.
我知道抽象类和接口之间的基本区别.

1)当需求需要在特定操作的每个子类中实现相同的功能(实现方法)和其他一些操作的不同功能(仅方法签名)时,使用抽象类

2)如果需要将签名设置为相同(并且实现不同),请使用接口,以便您可以遵守接口实现

3)我们可以扩展一个抽象类的最大值,但可以实现多个接口

重申一个问题:除了上面提到的那些之外,还有其他任何场景,具体我们需要使用抽象类(一个是模板方法设计模式在概念上仅基于此)吗?

接口与抽象类

在这两者之间做出选择真的取决于你想做什么,但幸运的是,对我们来说,Erich Gamma可以帮助我们一点.

一如既往地存在权衡,接口为您提供基类的自由,抽象类使您可以自由地在以后添加新方法. - Erich Gamma

无法在不改变代码中的许多其他东西的情况下更改接口,因此避免这种情况的唯一方法是创建一个全新的接口,这可能并不总是一件好事.

Abstract classes应主要用于密切相关的对象.Interfaces更好地为不相关的类提供通用功能.

java abstract-class design-patterns interface

79
推荐指数
7
解决办法
8万
查看次数