【问题标题】:An example of a mixin in Java? [duplicate]Java中的mixin示例? [复制]
【发布时间】:2013-08-02 00:01:38
【问题描述】:

在 Effective Java 第 93-4 页,我遇到了 mixin 一词。但是我发现很难想象 mixin 到底是什么。任何人都可以通过提供 Java 中的 mixin 示例来帮助我吗?

【问题讨论】:

  • 混音没有单一的含义。如果您提供了书中的报价,那将更容易提供帮助。

标签: java mixins


【解决方案1】:

您指的是 Effective Java 的第 18 条 - 首选接口而不是抽象类,我特别相信以下部分:

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

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

【讨论】:

  • 将此定义与其他语言(如 Ruby 或 Python)中的 mixin 进行比较是很有用的。在这些语言中,类可以有多个父类,因此一个类可以从任意数量的通用父类中引入逻辑。它们被认为是 mixins,因为它们不是被认为是类的主要父类,而是一些已“混入”的附加逻辑。示例:ruby-doc.org/docs/ProgrammingRuby/html/tut_modules.html#S2
  • 接口不是混合的。接口不保存状态甚至代码,因此它不是一个混合。例如,您不能使用一个抽象方法 forEach 和 10 个提供基于它的功能的具体方法(droptakefiltermap,... ). 使用接口,您可以声明所有这些方法,但任何实现此接口的类都必须为所有这些方法提供实现,而不仅仅是 1.Abstract 类对此非常有用,但它们仅限于 1 作为类的父类他们把你放在特定的层次结构中。不要混入
【解决方案2】:

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

【讨论】:

  • 方面不是 Java 语言的一部分。 java中的方面是在代码编译后通过字节码编织来实现的,所以它是一个后编译工具。
  • 但是java可以实现这样的字节码编织。并且接口代理是 Java 的一部分。
  • 接口代理不提供完整的混合支持。
【解决方案3】:

在“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 看起来很丑,因为它只是在玩文字游戏。

【讨论】:

  • 示例只针对一个接口,没有mixin
  • 在这个例子中,我使用了 AbstractMixInProvider 作为一个 mixin。它是否是接口不是重点。我试图为@blackpanther 描述一个示例情况,以便他可以理解“有效Java”中的方法。
  • 你不能以这种方式使用 2 个抽象类来做到这一点。
  • 不,你可以t. That why you can use multiple interfaces for your target class or one AbstractMixinProvider with multiple interfaces in it. Thats 为什么我认为,称所有这些东西为“mixin”很奇怪。
猜你喜欢
  • 2018-02-03
  • 2019-04-14
  • 2011-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-16
  • 2017-09-15
  • 2017-08-21
相关资源
最近更新 更多