Java中mixin的一个例子?

bla*_*her 12 java

我刚刚阅读了Effective Java的第93-4页,但我遇到了一个混合术语.但我发现很难想象出mixin究竟是什么.有没有人可以通过提供Java中的Mixin示例来帮助我.感谢您的帮助,因为我搜索了Stackoverfolw和互联网,但没有发现任何确切的结论.

Edd*_*Edd 12

您指的是有效Java的第18项- 首选接口到抽象类,我相信以下部分:

接口是定义mixins的理想选择.松散地说,mixin是类可以实现的类型,除了它的"主类型"之外,它声明它提供了一些可选行为.例如Comparable,一个mixin接口允许类声明它的实例是相对于其他可相互比较的对象进行排序的.这样的接口称为mixin,因为它允许将可选功能"混入"到类型的主要功能.抽象类不能用于定义mixins,原因与它们不能被改装到现有类相同:一个类不能有多个父类,并且类层次结构中没有合理的位置来插入mixin.

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

  • 接口不是混合的.接口不保持状态甚至代码,因此它不是混合.例如,你不能用一个抽象方法`forE`定义一个名为`Traversable`的混合和10个提供基于它的功能的具体方法(`drop`,`take`,`filter`,`map`,...使用接口可以声明所有这些方法,但实现此接口的任何类都必须为所有这些方法提供实现,而不仅仅是1.Abstract类对此非常有用,但它们仅限于1作为类的父类他们把你放在特定的层次结构中.不要混合 (3认同)
  • 将此定义与另一种语言(如 Ruby 或 Python)中的 mixin 进行比较是很有用的。在这些语言中,类可以有多个父类,因此一个类可以从任意数量的通用父类中引入逻辑。它们被认为是 mixin,因为它们不是类的主要父类,而是一些已“混入”的附加逻辑。示例:http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_modules.html#S2 (2认同)
  • @RokL我假设这个评论是在Java 8发布之前,之后你可以使用默认方法*完全*做到这一点?;) (2认同)

Rok*_*okL 7

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