Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/388.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中的mixin示例?_Java - Fatal编程技术网

Java中的mixin示例?

Java中的mixin示例?,java,Java,我刚刚阅读了《高效Java》第93-4页,但我遇到了“混合”这个术语。但我发现很难想象混血儿到底是什么。有谁能帮我提供一个Java混合的例子吗。感谢您的帮助,因为我已经搜索了Stackoverfolw和Internet,但没有找到真正明确的结论。在java中没有混入这样的东西,因为无法将一段代码添加到单独层次结构中的类中。要做到这一点,需要多重继承或最少的Scala类型特征。在“有效Java”的范围内,只在逻辑上提到它,没有具体的Java实现。例如,一个可比较的接口。它不会改变类的用途,也不会混

我刚刚阅读了《高效Java》第93-4页,但我遇到了“混合”这个术语。但我发现很难想象混血儿到底是什么。有谁能帮我提供一个Java混合的例子吗。感谢您的帮助,因为我已经搜索了Stackoverfolw和Internet,但没有找到真正明确的结论。

在java中没有混入这样的东西,因为无法将一段代码添加到单独层次结构中的类中。要做到这一点,需要多重继承或最少的Scala类型特征。

在“有效Java”的范围内,只在逻辑上提到它,没有具体的Java实现。例如,一个可比较的接口。它不会改变类的用途,也不会混淆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看起来很难看,因为它只是在玩弄文字。

您指的是-更喜欢接口而不是抽象类的第18项,我特别相信以下部分:

接口是定义mixin的理想选择。不严格地说,mixin是 类除了其“主类型”之外还可以实现,以声明它提供了一些 任性行为。例如,
Comparable
是一个mixin接口,允许类 声明其实例是相对于其他相互可比较的对象排序的。 这种接口称为mixin,因为它允许可选功能“混合” 在“中”到类型的主要功能。抽象类不能用于定义的混合 同样的原因是它们不能被改装到现有的类上:一个类不能有 多个父级,并且在类层次结构中没有插入 混音


本质上,在抽象类和接口中指定功能之间的一个关键区别是,接口版本可以在许多不同的类层次结构中使用,而抽象类只能在一个类层次结构树中使用,因为Java只允许单一继承。

混入并不仅仅意味着单一继承。如果您提供了这本书中的一段引文,将更容易提供帮助。java中的方面是在代码编译后通过字节码编织实现的,因此它是一个编译后工具。但是java支持这种字节码编织。接口代理是Java的一部分。接口代理不提供完整的混合支持。将此定义与另一种语言(如Ruby或Python)中的混合进行比较非常有用。在这些语言中,类可以有多个父类,因此一个类可以从任意数量的泛型父类引入逻辑。它们被认为是mixin,因为它们不是类的主要父类,而是一些已“混合”的附加逻辑。示例:接口不是mixin。接口不包含状态,甚至不包含代码,因此它不是混合。例如,您不能使用一个抽象方法
forEach
和10个基于它提供功能的具体方法(
drop
take
filter
map
,…)来定义一个名为
Traversable
的混合,但是,任何实现该接口的类都必须为所有类提供实现,而不是仅为1个。抽象类在这方面非常有用,但它们仅限于1个作为类的父类,并且它们将您置于特定的层次结构中。不混合示例仅针对一个接口,在这个例子中,我使用AbstractMixInProvider作为mixin。它是否是一个接口并不是问题的关键。我试着描述@blackpanther的一个示例情况,这样他就可以理解“有效Java”的方法。这样用两个抽象类就无法做到这一点。不,你可以
t。这就是为什么可以为目标类使用多个接口,或者使用一个包含多个接口的AbstractMixinProvider。这就是为什么我认为,把这些东西称为“混合”是很奇怪的。