Подтвердить что ты не робот

Пример mixin в Java?

Я только что читал страницу 93-4 Эффективной Java, но я встретил термин mixin. Но мне трудно представить себе, что такое mixin. Может кто-нибудь, пожалуйста, помогите мне, представив пример Mixin на Java. Спасибо за вашу помощь, потому что я искал Stackoverfolw и Интернет, но не нашел ничего действительно убедительного.

4b9b3361

Ответ 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.