Super erzwingen, konzept/pattern gesucht.

Empire Phoenix

Top Contributor
Hi, mein Problem ist folgendes:

Ich habe die Klassen
SEntity
-> ..
SUseable
->
SChest....

SEntity ist hierbei die Obersteklasse für ein Serverseitiges Entity, und enthält umbeding notwendigen code. Unter anderem auch die methode update(), die alle 50 ms aufgerufen wird und aus netzwergründen wichtig ist.

Nun erbt SUseable sowie einige dutzend andere Klassen von SEntity, die alle ebenfalls eigene logic im update() hinzufügen. Als beispiel sei hier eine SChest genannt.

Nun kann es passieren das zb bei der SChest vergessen wird im update() super.update() aufzurufen, gibt es einen weg wie ich dieses erwingen kann?

Das normale vorgehen währe ja update in SEntity final zu machen und eine leere methode doupdate() zu erstellen die dann dort aufgerufen wird und von den subklassen untsprechend implementiert wird. Jedoch habe ich eine nicht vorhersagbare tiefe von vererbungen und muss dennoch garantieren können, das IMMER alle super aufgerufen werden.
 

Landei

Top Contributor
Soweit ich weiß geht das nur, in dem man update [c]final[/c] macht, und in den Unterklassen andere Namen verwendet, etwa:

Java:
public abstract class SEntity {
    public final void update(){ 
        beforeUpdate();
        //wichtiger Code
        afterUpdate();
    }
  
    public abstract void beforeUpdate();
    public abstract void afterUpdate();
}

Die Unterklassen können dann in [c]beforeUpdate[/c] und [c]afterUpdate[/c] tun, was sie wollen, aber [c]update[/c] selbst nicht mehr überschreiben. Natürlich kann dieses Design für manche Aufgaben zu unflexibel sein.
 
G

Gastredner

Gast
Ich glaube kaum, dass es da eine technische Lösung geben wird. Spontan würde mir nur ein Flag einfallen, welches von der doupdate-Methode in SEntity gesetzt wird (doupdate dürfte dann nicht abstract sein). update würde nach dem Aufruf von doupdate dann überprüfen, ob dieses Flag gesetzt worden ist und bei Bedarf eine Exception schmeißen. Irgendetwas in diese Richtung also:
Java:
public class SEntity {

	private boolean checkSuper;

	public final void update() {
		doUpdate();
		if (checkSuper) {
			checkSuper = false;
		} else {
			throw new IllegalStateException("Overridden doUpdate methods MUST call super.doUpdate()!");
		}
	}

	public void doUpdate() {
		checkSuper = true;
	}
}
Dem Entwickler, der das super in seiner überschriebenen doupdate-Methode vergisst, würde das Programm daher beim ersten Test mit einer entsprechenden Fehlermeldung um die Ohren fliegen. Sonderlich elegant kommt mir das allerdings nicht vor.
Am einfachsten und womöglich auch am besten wäre einfach ein entsprechender, sehr deutlicher Hinweis in der Dokumentation von SEntity bzw. update.
 
Zuletzt bearbeitet von einem Moderator:
S

SlaterB

Gast
unbekannt viele Ebenen sorgen höchstens für unschöne Methodennamen: update2(), update3(), ..,
wären technisch aber denkbar zusammen mit final
 

FArt

Top Contributor
Ich würde hier von Vererbung absehen und Delegation verwenden. Der ursprünglichen Beschreibung nach, könnte das Dekorierer-Muster hier ein passendes Muster sein. Man könnte dann z.B. die entsprechenden Objekte mit der Netzwerkfunktionalität aus "update" dekorieren.
 

Empire Phoenix

Top Contributor
Hi, danke erstmal für die vorschläge,

@Landei
hätte halt wie SlaterB sagt das problem das ich dann (schon derzeit) auf update6() kommen würde, und das ganze relativ unübersichtlich wird, ansonsten technsich gesehen sicher eine stabile Lösung.

@Gastredner
Denke ich werde das erstmal mit dem flag einbauen, das ist zwar nicht die technisch geniale Lösung, jedoch bin ich soweiso die Person die das ab und zu vergisst und auch die einzige die mit arbeitet (trotz doku davon inner Javadoc)

@Fart an und für sich klingt das Decorator pattern hier sinnvoll, das Problem ist jedoch das das update lediglich ein kleiner teil der ganzen Klasse ist, und ich für den rest normale vererbung brauche.
 

FArt

Top Contributor
@Fart an und für sich klingt das Decorator pattern hier sinnvoll, das Problem ist jedoch das das update lediglich ein kleiner teil der ganzen Klasse ist, und ich für den rest normale vererbung brauche.

Das ist oft so. Man kann ja auch verschiedene Konzepte und Pattern kombinieren, z.B. gibt es Belange (concerns), die eine engere Bindung benötigen. Die regelt man gerne über Vererbung. Andere können mit Delegation besser gelöst werden. Und auch dafür gibt es mehr als nur einen Ansatz...

Generell: favour composition over inheritance... ist immer eine gute Regel...
 

Landei

Top Contributor
Hier eine Rube-Goldberg-Overkill-Lösung, die ausnutzt, dass eine Klasse super im Konstruktor aufrufen muss:

Java:
public class Super {
    
    private final Class<? extends Super.Updater> clazz;
    
    public static class Updater {
        public Updater() {
            System.out.println("Do some super stuff"); 
        } 
    }
    
    public Super(Class<? extends Super.Updater> clazz) {
        if (! Super.Updater.class.isAssignableFrom(clazz)) {
              throw new IllegalArgumentException("Cheater!");
        }
        this.clazz = clazz;
    }
    
    public final void update() {
        try {
          clazz.newInstance();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
}

Java:
public class Sub extends Super {
    
    public static class Updater extends Super.Updater {
        public Updater() {
           System.out.println("Do some sub stuff");   
        }
    }
    
    public Sub() {
        super(Updater.class);
    }
   
}


Java:
new Sub().update();
//--> Do some super stuff
//--> Do some sub stuff
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
L Super User via Processbuilder (Linux) Allgemeine Java-Themen 3
J Überschriebene Funktion soll nicht die super Funktion aufrufen Allgemeine Java-Themen 4
perlenfischer1984 Mit Lombok Builder Felder in Super Klasse füllen Allgemeine Java-Themen 12
Hacer List<? super E> Allgemeine Java-Themen 10
P Performance: super explizit erwähnen oder weglassen? Allgemeine Java-Themen 5
T Super Klasse Vererbung Problem :/ Allgemeine Java-Themen 10
G super- Methode aufrufen Allgemeine Java-Themen 21
trash super + JTable Allgemeine Java-Themen 7
trash super() mit Variable bestücken Allgemeine Java-Themen 3
G Super- und Subclass Allgemeine Java-Themen 2
S Stellung von super() Allgemeine Java-Themen 4
G super.super Allgemeine Java-Themen 7
conan2 super-super-Konstruktor? Allgemeine Java-Themen 3
P mehrere super klassen Allgemeine Java-Themen 10
thE_29 Foxtrot doch nicht so super. Allgemeine Java-Themen 12
D super-Konstruktor ist nicht super ;) Allgemeine Java-Themen 6
H Super-Konstruktor Allgemeine Java-Themen 7
V Vererbungsproblem --> Implicit super constructor Allgemeine Java-Themen 5
thE_29 PrintStream und super.println() Allgemeine Java-Themen 2
S Inlining erzwingen kombiniert mit Entfernen von Imports..? Allgemeine Java-Themen 11
S Die Initialisierung von Feldern in ableitender Klasse erzwingen..? Allgemeine Java-Themen 16
T Überschreiben von Methoden erzwingen Allgemeine Java-Themen 20
R Member-Variable erzwingen Allgemeine Java-Themen 17
S Löschen von Objekt erzwingen Allgemeine Java-Themen 4
G Statische Methoden erzwingen Allgemeine Java-Themen 2
W Timer Konzept-Frage Allgemeine Java-Themen 16
S Suche Konzept: Korrektheit des Aufrufers feststellen Allgemeine Java-Themen 7
J MVC Konzept Allgemeine Java-Themen 1
reibi log4j - Bestes Konzept Allgemeine Java-Themen 10
D GUI-Controller Konzept Allgemeine Java-Themen 6
G UML Konzept Allgemeine Java-Themen 3
M Backend Entwicklung - Konzept fragen Allgemeine Java-Themen 3
E Wie anfangen? Konzept / Designfrage Allgemeine Java-Themen 17
R Konzept eines Software-Rollout/Synchronisation via WebService Allgemeine Java-Themen 5
D Observer/Observable Pattern vs. Listener-Konzept Allgemeine Java-Themen 4
MQue Thread Konzept Allgemeine Java-Themen 8
G MVC-Konzept - effizienz beim "notify" Allgemeine Java-Themen 2
MQue Konzept- Frage zum Button-Aktualisieren Allgemeine Java-Themen 5
S Frage zum Java-Konzept Allgemeine Java-Themen 6
H GUI - Konzept Allgemeine Java-Themen 3
S Konzept: Innere Klasse, Anwendungsbeispiel? Allgemeine Java-Themen 4

Ähnliche Java Themen

Neue Themen


Oben