Wie muss eine Methode markiert werden?

8

Angenommen, Sie erstellen eine Person namens Person mit dem Builder-Muster und nehmen an, dass die Builder-Klasse die Methoden body() , head() , arms() und natürlich build() enthält und Sie die Methoden head() und build() berücksichtigen. obligatorisch für den Benutzer dieser Klasse.

Wir möchten diese Methoden irgendwie als obligatorisch markieren, wenn möglich mit Anmerkungen. Wenn ein Benutzer dieser Klasse versucht, eine Person-Instanz zu erstellen, aber vergessen hat, eine dieser Methoden aufzurufen, möchten wir eine Art Warnung erhalten - entweder vom Java-Compiler oder vielleicht von Eclipse oder Maven, mit denen wir unsere erstellen Projekte - jeder von ihnen würde tun.

Ist es möglich zu tun? Welchen Weg würdest du vorschlagen?

    
uzilan 03.02.2012, 09:20
quelle

6 Antworten

16

Hier ist ein Beispiel, bei dem verschiedene Typen verwendet werden, um einige Teile obligatorisch zu machen (es macht auch die Reihenfolge, die Sie die Methoden aufrufen, obligatorisch):

%Vor%

Bearbeiten

Das OP war von dieser Antwort so beeindruckt, dass er es vollständig in einem Blog . Es ist so eine clevere Interpretation des Builder-Musters, dass eine vollständige Behandlung verdient, hier erwähnt zu werden.

    
pgras 03.02.2012, 11:13
quelle
3

Ich glaube, die richtige Verwendung des Builder-Musters würde das Problem lösen, das Sie haben.

Ich würde die Klasse PersonBuilder erstellen, die die Methoden setBody() und setArms() und jede andere optionale Parameter-Setter-Methode enthalten würde. Der Konstruktor des Builders würde die erforderlichen Parameter übernehmen. Dann würde die Methode build() die neue Instanz von Person zurückgeben.

%Vor%

Alternativ könnten Sie den Parameter Head an die Methode build() übergeben, aber ich bevorzuge es stattdessen im Konstruktor zu übergeben.

    
janhink 03.02.2012 09:30
quelle
1

Keine Möglichkeit mit dem Compiler.

Sie können eine Laufzeitausnahmebedingung von der build() -Methode auslösen, wenn der Builder nicht ordnungsgemäß initialisiert wurde (und einen Test hat, der in der maven-Testphase aufgerufen wird)

Sie können aber auch build(..) ein HeadDetails -Objekt akzeptieren lassen. Auf diese Weise kann tou keinen Build aufrufen, ohne die obligatorischen Parameter anzugeben.

    
Bozho 03.02.2012 09:23
quelle
1

Warum rufe body (), head (), arms () nicht in der build () - Methode auf, wenn es wirklich obligatorisch ist und Person in der build () Methode zurückgibt?

[Bearbeiten]

Kurzes Beispiel:

%Vor%     
ollins 03.02.2012 09:29
quelle
0

Vielleicht könnten Sie innerhalb von build() prüfen, ob alle erforderlichen Methoden aufgerufen wurden. Vielleicht hat die Person -Instanz eine interne Plausibilitätsprüfung, die von build() ausgelöst wird.

Natürlich überprüft dies das Laufzeitverhalten und ist keine statische Analyse, wie Sie es beschreiben.

    
user647772 03.02.2012 09:23
quelle
0

ist nicht möglich, diese Methoden im Konstruktor von Person aufzurufen?

    
tartak 03.02.2012 09:29
quelle