2016-05-06 5 views
0

Nur ein paar Fragen zu setzen:Use ‚dieses‘ Schlüsselwort der Basiskonstruktor aufrufen und Methode ruft die private Mitglieder

1) Wenn Sie eine Super-Klasse Monster haben und Sie erstellen eine Unterklasse, die sein Verhalten erbt. Es ist eine gute Praxis, super in jedem Konstruktor in der subclass aufzurufen. Was ich unten getan habe, ist es einmal im ersten überladenen Konstruktor aufzurufen und im zweiten überladenen Konstruktor den ersten Aufruf mit . Ist das die beste Vorgehensweise?

2) Ist es besser, die Methodenaufrufe setHealthAid(10) die Klasseneinsatzfelder Zuordnung heißt

mHealthAid = -1; 
mHasInvisibleMode = false; 

Klasse Schnipsel ohne die Implementierung von Getter und Setter statt zu setzen d.h zu verwenden, um dies kurz zu machen.

public class Monster { 
    private int mStrength; 
    private int mScareFactor; 

    public Monster(int strength, int scareFactor) {  
     setStrength(strength);  
     setScareFactor(scareFactor);  
    } 

    /* Getters and setters */ 
} 

public class BigBoss extends Monster { 
    private int mHealthAid; 
    private boolean mHasInvisibleMode; 

    public BigBoss(int strength, int scareFactor) {  
     super(strength, scareFactor);  
     setHealthAid(-1);  
     setHasInvisibleMode(false);  
    }  
    public BigBoss(int strength, 
        int scareFactor, 
        int healthAid, 
        boolean hasInvisibleMode) {  
     this(strength, scareFactor);  
     setHealthAid(healthAid);  
     setHasInvisibleMode(hasInvisibleMode); 
    } 

    /* Getters and setters */ 
} 

Vielen Dank für Ihre Anregungen,

+1

Dies sollte auf dem Code Review-Netzwerk sein. Hier stellen wir Arbeitscode, um zu fragen, ob es einen "besseren" Weg gibt, Dinge zu tun. – nhouser9

Antwort

1

1) Wenn Sie eine Super-Klasse Monster haben und Sie erstellen eine Unterklasse, die sein Verhalten erbt. Es ist eine gute Übung, Super in jedem Konstruktor in der Unterklasse aufzurufen. Was ich unten getan habe, ist es einmal in der erste überladene Konstruktor und im zweiten überladenen Konstruktor rufe ich die erste mit diesem (..) Ist dies die beste Praxis?

Sie sollten einen Konstruktor haben, der alle erforderlichen Parameter zur korrekten Klasseninstanziierung enthält. Im zweiten Konstruktor mit weniger Parametern sollten Sie den ersten Konstruktor mit this aufrufen und die Standardwerte für die fehlenden Parameter übergeben. Wie:

public BigBoss(int strength, int scareFactor) {  
    this(strength, scareFactor, -1, false); 
}  

//costructor with all required params to instantiate BigBoss properly 
public BigBoss(int strength, 
       int scareFactor, 
       int healthAid, 
       boolean hasInvisibleMode) { 
    super(strength, scareFactor);  
    mHealthAid = healthAid;  
    mHasInvisibleMode = hasInvisibleMode; 
} 

2) Ist es besser, die Methode zu verwenden, ruft das heißt setHealthAid (10) zu setzen die Klasseneinsatzgebiete Zuordnung statt

Sie können aus Einrichter von Feldern verwenden dieselbe Klasse zum Festlegen von Eigenschaften. Da Sie jedoch bereits in derselben Klasse sind, sollten Sie die Eigenschaft direkt verwenden, um Werte festzulegen, z.

Dies macht den Code ein wenig prägnant und Sie erhalten kleine Leistungssteigerung, da kein Methodenaufruf beteiligt ist.

1

Das funktioniert, ist aber ineffizient, weil Sie die Methode und setHasInvisibleMode(...) zweimal aufrufen, wenn der zweite Konstruktor verwendet wird. Was Sie stattdessen tun können, ist dies:

public BigBoss(int strength, int scareFactor) { 
    this(strength, scareFactor, -1, false);  
}  
public BigBoss(int strength, 
       int scareFactor, 
       int healthAid, 
       boolean hasInvisibleMode) { 
    super(strength, scareFactor);  
    setHealthAid(healthAid);  
    setHasInvisibleMode(hasInvisibleMode); 
} 
Verwandte Themen