【发布时间】:2013-08-02 00:01:38
【问题描述】:
在 Effective Java 第 93-4 页,我遇到了 mixin 一词。但是我发现很难想象 mixin 到底是什么。任何人都可以通过提供 Java 中的 mixin 示例来帮助我吗?
【问题讨论】:
-
混音没有单一的含义。如果您提供了书中的报价,那将更容易提供帮助。
在 Effective Java 第 93-4 页,我遇到了 mixin 一词。但是我发现很难想象 mixin 到底是什么。任何人都可以通过提供 Java 中的 mixin 示例来帮助我吗?
【问题讨论】:
您指的是 Effective Java 的第 18 条 - 首选接口而不是抽象类,我特别相信以下部分:
接口是定义 mixin 的理想选择。简单地说,mixin 是一种 类可以实现除了它的“主要类型”来声明它提供了一些 可选行为。例如
Comparable是一个mixin接口,它允许一个类 声明它的实例相对于其他相互比较的对象是有序的。 这样的接口称为 mixin,因为它允许“混合”可选功能 in" 到类型的主要功能。抽象类不能用于为 与它们不能改装到现有班级的原因相同:班级不能拥有 多个父级,并且在类层次结构中没有合理的位置插入 混音。
本质上,在抽象类和接口中指定功能之间的主要区别之一是接口版本可以在许多不同的类层次结构中使用,而抽象类只能在一个类层次结构中使用树,因为 Java 只允许单继承。
【讨论】:
forEach 和 10 个提供基于它的功能的具体方法(drop,take,filter,map,... ). 使用接口,您可以声明所有这些方法,但任何实现此接口的类都必须为所有这些方法提供实现,而不仅仅是 1.Abstract 类对此非常有用,但它们仅限于 1 作为类的父类他们把你放在特定的层次结构中。不要混入
在java中没有混入这样的东西,因为没有办法将一段代码添加到单独的层次结构中的类中。这样做需要多重继承或至少需要 Scala 类型特征。
【讨论】:
在“Effective Java”的范围内,只是在逻辑上提及,没有具体的Java实现。例如,一个 Comparable 接口。它不会改变你的课堂目的或混淆你的 api 用户。它只是混合了用于排序和比较的功能。因此,在 Java 上下文中,我会将其缩小为装饰器模式。
混入的另一种变体可能如下。假设,您有:
interface IMyInterface
{
public void doStuff();
}
class MyClass implements IMyInterface
{
public void doStuff(){};
}
现在我们想要“混合”一些额外的功能。我们添加一个抽象类:
abstract class AbstractMixInProvider
{
public abstract void doMixinStuff();
}
我们从 AbstractMixInProvider 扩展 MyClass:
class MyClass extends AbstractMixInProvider implements IMyInterface
{
public void doStuff(){};
public void doMixinStuff();
}
但是,正如我上面提到的,试图将混合概念引入 Java 看起来很丑,因为它只是在玩文字游戏。
【讨论】:
t. That why you can use multiple interfaces for your target class or one AbstractMixinProvider with multiple interfaces in it. Thats 为什么我认为,称所有这些东西为“mixin”很奇怪。