2016-04-04 13 views
-1

Ich war in der Lage, einen geheimen Test mit meinem Code zu bestehen, der im Wesentlichen den Code mit bestimmter Eingabe und erwarteter Ausgabe prüft. Ich hielt eine Assertion Fehler immer in dem es hieß, erwartet < 1> aber war: < 0> Bis ich den Code aus dieser geändert:Unterschied zwischen der Verwendung dieser beiden Standardkonstruktoren?

public Gunner(){ 
    this.gunpower = 1; 
    this.GunnerStrength = 1; 
    this.name = "Default Gunner"; 
} 

zu

public Gunner() { 
    this("Default Gunner", 1, 1); 
} 

weiter zu veranschaulichen und Bezugspunkte zu geben, hier sind die Codes, die den obigen Code vorangestellt wird:

package ship; 

public class Gunner { 
    private String name; 
    private int gunpower; 
    private int GunnerStrength; 
    private int maxGupower; 
    private int maxGunnerStrength; 
    private int currentGunpower; 
    private int currentGunnerStrength; 

    public Gunner(String l_name, int l_gunpower, int l_GunnerStrength) { 
     this.name = l_name; 
     this.currentGunpower = maxGunpower = l_gunpower; 
     this.currentGunnerstrength = maxGunnerStrength = l_GunnerStrength; 
    } 

    public Gunner(Gunner other) { 
     this.name = new String(other.name); 
     this.gunpower = new Integer(other.gunpower);  
     this.GunnerStrength = new Integer(other.GunnerStrength); 
     this.maxGunpower = new Integer(other.maxGunpower); 
     this.maxGunnerStrength = new Integer(other.maxGunnerStrength); 
     this.currentGunpower = new Integer(other.currentGunpower);            
     this.currentGunnerStrength = new Integer(other.currentGunnerStrength); 
    } 
} 

Wenn jemand die Unterschiede zwischen den beiden Codes bitte erklären könnte, darüber viel sein würde, abgeschrieben.

+0

Abhängig von Ihrem "Test" hat der erste weder currentGunpower noch currentGunnerStrength eingestellt. Stellen Sie im Grunde sicher, dass Sie alle Instanzvariablen initialisieren, wenn sie wichtig sind. – KevinO

+3

_ "einen geheimen Test bestehen" _ - Was ist ein geheimer Test? –

+0

Was meinst du mit "geheimer Test"? Wenn das eine Art von Kurs ist, denke ich, dass Sie mit dem Kursleiter klären müssen. – krock

Antwort

1

Ihre ursprüngliche Gunner() Konstruktor versucht die Logik des Gunner(String,int,int) Konstruktor duplizieren, obwohl sie offenbar (wie Sie bestanden haben, was auch immer das „Geheimnis-Test“ war), ist es richtig, nicht gescheitert, da sie in verschiedenen Bereichen gefüllt: Es initialisierte gunpower, und name; aber der andere Konstruktor initialisiert name, currentGunpower, maxGunpower, currentGunnerStrength und maxGunnerStrength. Das ist eine ganz andere Reihe von Feldern.

Ihr überarbeiteter Gunner() Konstruktor wieder verwendet die Logik des Gunner(String,int,int) Konstruktor, anstatt zu versuchen, sie zu duplizieren. Und so füllt es die Felder, die Gunner(String,int,int) ausfüllt. Vermutlich erwartete der Test diese Felder ausgefüllt werden.

Im Allgemeinen ist Duplizieren Logik eine schlechte Idee, weil sich zwangsläufig Dinge im Laufe der Zeit ändern, so dass es keine überzeugenden Argumente gibt im gegenteil, wiederverwenden eher als duplizieren logik ist der weg zu gehen.


Re Ihre edit:

ich eine Assertion Fehler gehalten bekommen, die < 1 erwartet angegeben> aber war: < 0>

Der Standardwert eines int Feld 0, wenn Sie also das Feld nicht initialisieren oder einen anderen Wert zuweisen, hat es den Wert 0. So vermutlich die Unit-Test wurde den Wert eines der Felder Überprüfung Ihrer ursprünglichen Gunner() nicht füllen (currentGunpower, maxGunpower, currentGunnerStrength oder maxGunnerStrength), aber Ihre neue Gunner()hat füllen (über Gunner(String,int,int)).


Randbemerkung:

Unterschied zwischen diesen beiden Konstrukteure Standard verwenden?

Es gibt keine Standardkonstruktoren in Ihrem Code. Eine default constructor wird vom Compiler bereitgestellt, wenn Sie keine Konstruktoren für die Klasse definieren. Da Sie do Konstruktoren für die Klasse definieren, gibt es keinen Standardkonstruktor.

Ihr Gunner() Konstruktor ist ein Konstruktor ohne formale Parameter, manchmal ein Null-params Konstruktor oder ein Null-args Konstruktor oder ein nicht argument (n) Konstruktor (Java verwendet „Parameter“ genannt eher als "Argument", um auf die Dinge zu verweisen, die Sie in Methoden und Konstruktoren übergeben, aber sie werden auch gemeinhin informell "Argumente" genannt, daher "Argumente".

+0

Vielen Dank für Ihre Antwort. Was ich nicht verstehe ist, warum, wenn ich Standardkonstruktoren googelte nur die erste Version kam. Während der zweite war viel schwieriger zu finden. Warum ist der erste Standardkonstruktor viel häufiger? Wenn von denen, die mir sagen, die zweite ist viel besser? –

+0

@FooFighter: Es gibt keine "Standardkonstruktoren" in Ihrem Code. Es gibt einen * zero-parameters * (zero-args) -Konstruktor, aber keinen * default * -Konstruktor. Ein * Standardkonstruktor * ist ein Konstruktor, der vom Compiler hinzugefügt wurde, weil Sie der Klasse keine Konstruktoren im Code gegeben haben. Da Ihre Klasse Konstruktoren definiert hat, gibt es keinen * default * -Konstruktor. –

+0

Nun, wenn Sie alle Lehrbuch sicher sein wollen. Also ist ein öffentlicher Gunner() eigentlich ein Zero-Parameter-Konstruktor, weshalb würde der erste nicht genau die Werte initialisieren wie der zweite? –