Я только что читал страницу 93-4 Эффективной Java, но я встретил термин mixin. Но мне трудно представить себе, что такое mixin. Может кто-нибудь, пожалуйста, помогите мне, представив пример Mixin на Java. Спасибо за вашу помощь, потому что я искал Stackoverfolw и Интернет, но не нашел ничего действительно убедительного.
Пример mixin в Java?
Ответ 1
Вы имеете в виду пункт 18 Эффективная Java - Предпочитаете интерфейсы для абстрактных классов, и я считаю, что в следующем разделе, в частности:
Интерфейсы идеально подходят для определения миксинов.. Смехотворно говоря, mixin - это тип, который класс может реализовать в дополнение к его "первичному типу", чтобы заявить, что он предоставляет некоторые необязательное поведение. Например,
Comparable
- это интерфейс mixin, который позволяет классу объявите, что его экземпляры упорядочены относительно других взаимно сопоставимых объектов. Такой интерфейс называется mixin, поскольку он позволяет использовать необязательную функциональность в "к основной функции типа. Абстрактные классы не могут использоваться для определения миксинов для по той же причине, что их нельзя переоснастить на существующие классы: класс не может быть более одного родителя, и в иерархии классов нет разумного места для вставки Mixin.
По сути, одно из ключевых различий между спецификацией функциональности в абстрактном классе и интерфейсе заключается в том, что версия интерфейса может использоваться в нескольких разных иерархиях классов, тогда как абстрактный класс может использоваться только в иерархии одного класса потому что Java допускает только однонаследование.
Ответ 2
В области "Эффективная Java" это упоминается просто логически, без конкретной реализации Java. Например, сопоставимый интерфейс. Это не меняет ваших целей в классе и не сбивает с толку ваших пользователей API. Он просто смешивает функциональность для сортировки и сравнения. Итак, в контексте Java я бы сузил это до шаблона Decorator.
Еще одна вариация дополнения может быть следующей. Предположим, у вас есть:
interface IMyInterface
{
public void doStuff();
}
class MyClass implements IMyInterface
{
public void doStuff(){};
}
Теперь мы хотим добавить некоторые дополнительные функции. Мы добавляем абстрактный класс:
abstract class AbstractMixInProvider
{
public abstract void doMixinStuff();
}
И мы расширяем MyClass из AbstractMixInProvider:
class MyClass extends AbstractMixInProvider implements IMyInterface
{
public void doStuff(){};
public void doMixinStuff();
}
Но, как я уже упоминал выше, попытка перенести концепцию смешивания в Java выглядит ужасно, потому что это просто игра слов.
Ответ 3
В java нет такой вещи, как mix-in, поскольку нет возможности добавить кусок кода в классы в отдельных иерархиях. Для этого потребуются множественные наследования или наименьшие черты типа Scala.