我刚刚阅读了Effective Java的第93-4页,但我遇到了一个混合术语。但我发现很难想象出mixin究竟是什么。有没有人可以通过提供Java中的Mixin示例来帮助我。感谢您的帮助,因为我搜索了Stackoverfolw和互联网,但没有发现任何确切的结论。
答案 0 :(得分:9)
你指的是Effective Java的第18项 - 更喜欢抽象类的接口,我特别相信以下部分:
接口非常适合定义mixins。松散地说, mixin 是一种类型 class可以实现除“primary type”之外的声明它提供的一些 可选行为。例如
Comparable
是一个允许类的mixin接口 声明它的实例是针对其他相互比较的对象进行排序的。 这样的接口称为mixin,因为它允许可选功能“混合” 在“到类型的主要功能。抽象类不能用于定义mixins 同样的原因是它们不能被改造成现有的课程:一个班级不能 多个父级,并且类层次结构中没有合理的位置来插入 混入。
本质上,在抽象类和接口中指定功能之间的关键区别之一是接口版本可以在许多不同的类层次结构中使用,而抽象类只能在一个类层次结构中使用树,因为Java只允许单继承。
答案 1 :(得分:2)
在'Effective Java'的范围内,它只是逻辑上提到,没有特定的Java实现。例如,Comparable接口。它不会改变您的课程目的或混淆您的api用户。它只是混合了分类和比较的功能。因此,在Java上下文中,我会将其缩小为Decorator模式。
混合的另一种变化可能如下。假设你有:
interface IMyInterface
{
public void doStuff();
}
class MyClass implements IMyInterface
{
public void doStuff(){};
}
现在我们想要'混合'一些额外的功能。我们添加一个抽象类:
abstract class AbstractMixInProvider
{
public abstracrt void doMixinStuff();
}
我们从AbstractMixInProvider扩展MyClass:
class MyClass extends AbstractMixInProvider implements IMyInterface
{
public void doStuff(){};
public void doMixinStuff();
}
但是,正如我上面提到的那样,尝试将混合概念引入Java看起来很丑陋,因为它只是在单词上播放。
答案 2 :(得分:1)
在java中没有混合的东西,因为没有办法将一段代码添加到单独的层次结构中的类中。为此,需要多重继承或最少Scala类型特征。