Was bedeutet das bei IDEA?

1 Antwort

Vom Beitragsersteller als hilfreich ausgezeichnet

Das ist eine Funktion aus dem Minecraft Development-Plugin für IntelliJ IDEA. Es bietet dir expliziten Support zu den Mixins, wie sie vom Mixin-Framework implementiert werden. Das heißt, wenn du solche Mixins nutzt, kann das Programm dir Codevorschläge, Fehlerprüfungen, u.ä. dazu anbieten.

Unter Mixins selbst versteht man einen Mechanismus (bzw. ein Pattern), der es/welches dir erlaubt, bestehenden Code während der Laufzeit zu modifizieren. So könnte man beispielsweise noch nachträglich Klassen um neue Verhaltensweisen erweitern.

In Java würde man so etwas mit Annotationen und Reflection lösen. Das oben erwähnte Mixin-Framework implementiert den Grundmechanismus bereits vor, sodass du nur noch vorgegebene Annotationen benutzen musst.

Bei einer einfachen Klasse wie dieser:

public class Disco {
  private List<Person> guests = new ArrayList<>();

  public void letIn(Person person) {
    guests.add(person);
  }
}

könnte eine Erweiterung, die noch eine zusätzliche Prüfung ergänzen soll, in etwa so aussehen:

@Mixin(Disco.class)
public class DiscoMixin {
  @Inject(method = "letIn", at = @At("HEAD"), cancellable = true)
  public void onLetIn(Person person, CallbackInfo info) {
    if (person.getAge() <= 18) {
      info.cancel();
    }
  }
}

Die hier definierte Methode wird vor den Aufruf von letIn aus dem Originalprogramm angehängt. Wenn die Prüfung fehlschlägt (also eine eintrudelnde Person jünger als 18 Jahre ist), wird die letIn-Methode erst gar nicht aufgerufen.

Mixins können zwar ein paar Vorteile liefern (z.B. mehr Flexibilität beim Arbeiten mit externen Programmbibliotheken, modulare Entwicklung), aber bergen ebenso Fehlerrisiken (bspw. Konfliktpotenzial, wenn sich mehrere Mixins aus verschiedenen Programmteilen an die gleichen Methoden hängen oder Codefehler, die sich anders als gewohnt erst zur Laufzeit bemerkbar machen). Umso mehr Mixins man in einem Projekt nutzt, umso schwieriger kann es später werden, bestimmte Programmabläufe noch leicht nachvollziehen zu können.