2016-05-17 40 views
7

Mi è stato detto da un professore che l'invocazione esplicita del costruttore utilizzando this era "scarsa pratica di codifica" e penalizzata per questo. Tuttavia, non sono stato in grado di trovare nulla in nessuna guida di stile java che ho guardato attraverso i commenti su di esso in un modo o nell'altro. Inoltre, sembra che sia stato fatto in un bel po 'di esempi di codice che ho visto. Speravo di ottenere qualche input sul fatto che questa sia una pratica di programmazione scadente e perché.Invocazione Constructor esplicita che usa "this" come pratica di codifica scadente?

Un esempio di ciò che mi riferisco a:

public class SomeClass { 

    private int a; 
    private int b; 

    public SomeClass() { 
     this(0); 
    } 

    public SomeClass(int a) { 
     this(a, 0); 
    } 

    public SomeClass(int a, int b) { 
     this.a = a; 
     this.b = b; 
    } 
} 

EDIT: Il suo commento era esattamente "un costruttore di chiamare un costruttore della stessa classe non è buona pratica Un costruttore crea un oggetto, in modo da chiamare. un costruttore che chiama un altro costruttore cosa sta accadendo in memoria?

e questo era il codice specifico:

public class Employee { 
    private String name; 
    private int monthlySalary; 

    // Default constructor 
    public Employee() { 
     this("", 0); 
    } 

    // Constructor 
    public Employee(String name, int monthlySalary) { 
     this.name = name; 
     this.monthlySalary = monthlySalary; 
    } 

    // annualSalary() method returns the annual salary of the employee as an int 
    public int annualSalary() { 
     return monthlySalary * 12; 
    } 

    // toString() method returns the employee name and monthly salary as a 
    // String in the format: name, monthly salary 
    public String toString() { 
     return "Name: " + name + "\t\tMonthly Salary: " + monthlySalary; 
    } 
} 
+0

Hanno dato un ragionamento per essere una cattiva pratica di codifica? L'unica ipotesi che posso fare è usare troppe variabili con lo stesso nome (confusione tra variabile di classe e variabile di metodo), ma non sono ancora sicuro al 100% sul perché direbbero che ... – Draken

+3

Penso che sia molto meglio di riassegnare le tue variabili in ogni sovraccarico. – shmosel

+3

È solo un professore, non è la massima autorità in questa domanda basata sull'opinione pubblica. Ovviamente l'uso di 'this()' renderà i tuoi costruttori dipendenti dagli altri costruttori, ma quanto sia "pericoloso" quel tipo di dipendenza, è discutibile. Gli utenti – Kayaman

risposta

7

In generale, l'uso this ai costruttori della catena non è cattivo stile. Potrebbe essere cattivo stile in particolari esempi, ma sarei solo pronto a fare quel giudizio basato sul codice specifico. Gli esempi artificiali (ad esempio l'esempio semantico-libero nella tua domanda) non possono essere giudicati.

Può darsi che il docente abbia effettivamente "risposto" a un altro problema; per esempio.

  • la creazione di un secchio-carico di inutili/confusione/sovraccarichi costruttore semanticamente confusi, o
  • non scrivere javadocs decenti per gli overload del costruttore.

Entrambi questi (IMO) sono di cattivo gusto nella misura in cui rendono il codice più difficile da leggere e gestire.


Si può sostenere che quando si concatenano costruttori che avete bisogno di guardare più costruttori di capire cosa sta succedendo. Ma l'argomentazione contraria è che rendere tutti i costruttori (artificialmente) indipendenti viola il principio DRY.