Frage

Gibt es eine Möglichkeit Mixins oder Züge in Java zu emulieren? im Grunde, ich brauche eine Möglichkeit, Mehrfachvererbung zu tun, damit ich gemeinsame Business-Logik zu mehreren Klassen hinzufügen

War es hilfreich?

Lösung

würde ich alle die Business-Logik in eine neue Klasse BusinessLogic kapseln und jede Klasse, die Anrufe an die Klasse machen muss BusinessLogic. Wenn Sie eine einzelne verwurzelten Hierarchie für Ihre Klassen müssen die Anrufe an BusinessLogic machen, haben Sie auch eine Schnittstelle erstellen (BusinessLogicInterface?)

In Pseudo-Code:

interface BusinessLogicInterace
{
    void method1();
    void method2();
}

class BusinessLogic implements BusinessLogicInterface
{
    void method1() { ... }
    void method2() { ... }
}

class User 
    extends OtherClass 
    implements BusinessLogicInterface
{
    BusinessLogic logic = new BusinessLogic();

    @Override
    void method1() { logic.method1(); }

    @Override
    void method2() { logic.method2(); }
}

Dies ist nicht die schönste Implementierung um einen Mangel an Mehrfachvererbung zu arbeiten, und es wird recht umständlich, wenn die Schnittstelle eine Menge von Methoden hat. Höchstwahrscheinlich werden Sie versuchen wollen und Ihren Code neu gestalten zu benötigen Mixins zu vermeiden.

Andere Tipps

Nicht so, wie Sie es tun wollen. Effective Java empfiehlt, "Favor Komposition der Vererbung". Das heißt, Sie die gemeinsame Logik zu anderen Klassen und delegieren bewegen. Dies ist, wie Sie rund um das Fehlen von Mehrfachvererbung in Java zu bekommen.

Ist das Objekt-Purist heute in Sie rühren?

Denken Sie mit etwas tun könnten, Composite-orientierte Programmierung?

Dann, Sir, suchen Apache Polygene (früher Qi4J oder Zest);)

Java Antwort auf Mehrfachvererbung ist die Fähigkeit, mehrere Schnittstellen zu implementieren. Natürlich ist dies bedeutet, dass Sie die Methode Erklärungen bekommen, aber nicht die Logik.

Sie könnten versuchen, Mixins durch Zusammensetzung emuliert: Ihre Java-Klasse Membervariablen definieren könnte, die anderen Klassen darstellen, die einige gemeinsame Business-Logik durchführen

.

Java-Klassen Bei der Gestaltung, ich habe nicht den Mangel an C ++ Stil Mehrfachvererbung fand das Design meiner Architektur zu hemmen. Sie werden einen Weg finden, zu erreichen, was Sie tun möchten.

QI4J können Sie Mixins verwenden

Sie können die Tatsache ausnutzen, dass Schnittstellen verschachtelte Klassen (automatisch public static) ermöglicht die Standardimplementierung der Interface-Methoden in der Oberfläche selbst gekapselte zu halten. D. h bewegen, um die Businesslogic Klasse von Alex B Beispiel in der Schnittstelle.

Dies ist ähnlich wie Scala den JVM-Code für Züge erzeugt, wie hier erklärt Wie werden Scala Züge in Java-Bytecode kompiliert?

Wenn dies tut das Beispiel wird:

interface BusinessLogicInterface {
    void method0();

    class DefaultImpl {
        private DefaultImpl() {
        }

        public static void method1(BusinessLogicInterface self) { ... }
        public static void method2(BusinessLogicInterface self) { ... }
    }

    void method1();
    void method2();
}

class User extends OtherClass implements BusinessLogicInterface {
    @Override
    void method0() { ... }

    @Override
    void method1() { BusinessLogic.defaultImpl.method1(this); }

    @Override
    void method2() { BusinessLogic.defaultImpl.method2(this); }
}

Beachten Sie, dass wir ein Objekt des Interface-Typs als „Selbst“ Parameter. Dies bedeutet, dass die Business-Logik andere abstrakte Methoden verwenden (method0). Dies kann sehr nützlich sein für einen Zug mit abstrakten Methoden zu schaffen, die alle orthogonal zueinander und Dienstprogramm „Erweiterung“ Methoden, die in Bezug auf diesen orthogonalen Methoden implementiert werden können.

Der Nachteil ist, dass jede Schnittstelle muss den vorformulierten Delegation Code kopieren / einfügen. Ein weiteres häufig verwendete Muster in Java ohne diesen Nachteil (aber mit weniger Zusammenhalt und weniger OO Art und Weise, die Methoden zu nennen) ist eine Klasse mit dem Plural Namen zu erstellen, wie die Schnittstelle die statischen Methoden enthält, das in der Sammlungen Utility-Klasse verwendet wird.

Die Implementierung einfacher mixin / Züge in Java unterstützen CGLIB / javassit ist sehr einfach. Sie können einen Blick zum Beispiel href="http://justonjava.blogspot.com/2011/10/mixins-aka-traits-implementation-in.html" rel="nofollow"> hier hier

Wie von Java-8 Standard-Interface-Methoden wurden hinzugefügt. Dies, zusammen mit der Mehrfachvererbung von Schnittstellen in Java sollte irgendeine Art von mixin ermöglichen. Klar, dass die Schnittstellen unabhängig voneinander arbeiten. So wird es erhebliche Einschränkungen sein.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top