Domanda

Stile di controllo dice:

Class should define a constructor.

PMD dice:

Avoid unnecessary constructors - the compiler will generate these for you.

Chi ha ragione?Oppure mettiamola in questo modo: quali sono i pro e i contro di avere un ctor predefinito vuoto in una classe?

È stato utile?

Soluzione

Mi piace la risposta di PMD. Il codice di meno e meglio è. Non costruttori di scrittura il compilatore scriveranno per voi.

La mia impressione è che l'argomento principale per scrivere il costruttore è che un povero programmatore che non capisce come i costruttori di lavoro in Java potrebbe inciampare il codice e si confondono. Non mi piace la scrittura di codice che viene inutilmente oscura, ma non mi piace la scrittura dumbed-down codice sia.

Ma questo sono io di essere ossessivo e probabilmente irragionevole. C'è un mondo di programmatori di applicazioni la cui centrale è concentrarsi sul business, non sulla lingua, e che non sono esperti di lingua. Una tecnica di sopravvivenza di un sacco di persone usano è quello di avere uno stile coerente, se è assolutamente necessario non è questo il punto.

Altri suggerimenti

Come per molte decisioni che sono 'controverso', la verità è che in realtà non importa più di tanto. Scrivere il costruttore o non fare. L'effetto sulla qualità e maintainbility del vostro codice sarà trascurabile. Se si esegue la codifica con gli altri poi adottare lo stesso stile per coerenza, ma per il resto -. Fai a seconda di quale si sente come

Quando il costruttore di default è l'unico costruttore, è 100% equivalente a scrivere esplicitamente con un corpo vuoto o omettere esso. Tuttavia, il compilatore non genera un costruttore di default se una costruttori esplicitamente definito, di default o meno. Questo significa che se si basano su al compilatore di generare un costruttore per voi, e poi aggiungere costruttori alternativi, quindi il costruttore di default va via. Personalmente, vorrei tendere verso lasciando che il compilatore fare la generazione in ogni caso; se quel costruttore di default era in uso genererà avvertenze di compilazione ed è facile da aggiungere a quel punto. Altrimenti, perché tenerlo intorno a tutti?

Anche se sono un po 'come codice di minore, ma avendo costruttore di default rendono più facile per impostare un punto di interruzione ogni volta che è necessario per eseguire il debug.

In ogni caso, posso ricordare che il sito web di PMD ha anche detto che la questione è controversa:)

Vengo con Checkstyle. Con nessun costruttore esplicito (noarg), nessuno saprà se esso è destinato o meno.

Considerate questo classe di utilità:

public class Util {
    // no constructor given - implicit default constructor
    // intended? probably not, but who knows

    public static void foo() {
      // blabla
    }

    public static void bar() {
      // more blabla
    }

}

Per impostazione predefinita il compilatore genera il costruttore di default per voi, quindi se non si desidera specificare eventuali azioni speciali (inizializzazione dei membri non è il punto qui), poi si deve non specificare il costruttore.

altra cosa è che alcune classi dovrebbero avere uno stato coerente. Per esempio si dispone di una classe Book. Non v'è non ha senso creare un libro con nessun titolo, per cui è necessario specificare un costruttore con parametro di stringa:

public Book(String name) {
    this.name = name;
}

Per quanto riguarda i costruttori di default che può essere necessario se si deve serializzare la classe e non utilizzarlo in marshalling / unmarshalling (JAXB richiede un costruttore di default vuoto).

Se non è questo il punto e la classe non ha quello che viene chiamato uno stato coerente, costruttore di default così vuoto è assolutamente inutile dichiarare.

Si dovrebbe ricordare che costruttore di default è pubblico per impostazione predefinita, in modo da considerare decalring un un esplicito se si desidera alcune restrizioni a questo.

Anche se la classe è piuttosto lungo si può considerare che dichiara un costruttore predefinito vuoto per aumentare la leggibilità.

Una cosa io aggiungo è che se non v'è nessun costruttore specificato, v'è un costruttore di default implicito che il codice può dipendere.

Poi, quando si aggiunge un costruttore specifico, il codice non può più di compilazione - o, peggio ancora, il codice non verrà eseguito (può essere una dipendenza riflettente sul costruttore senza parametri - la maggior parte degli strumenti ORM richiedono un costruttore di default essere presenti per le entità persistenti ).

Quale è il motivo per cui si dovrebbe aggiungere esplicitamente il costruttore di default, se è necessario.

dell'IMO Class should define a constructor perché se ti affidi a costruttori predefiniti le variabili di istanza avranno valori predefiniti (come zero per numeri interi, null per una stringa ecc.).Se vuoi impostare le variabili di istanza su un valore predefinito ogni volta che viene creato un oggetto per quella classe, definire tu stesso un costruttore può essere una buona scelta in quel caso.(A condizione che tu non voglia usare i metodi getter e setter)

class Cube {
   private int length;
   private int breadth;
   private int height;

  public Cube() {
      length = 10;
      breadth = 10;
      height = 10;
  }
     ......
     ......
}

Ora quando crei un oggetto della classe Cube1 tutte le variabili di istanza di quell'oggetto saranno impostate su 10.Se non usi un costruttore qui, le tue variabili di istanza (lunghezza, larghezza e altezza) avranno i valori predefiniti (zero in questo caso).


Modificato :[Aggiunta un'altra cosa]

Se fai affidamento sul compilatore per generare un costruttore predefinito per te e desideri utilizzare alcuni costruttori che accettano argomenti dall'utente, devi definire il costruttore predefinito altrimenti il ​​compilatore genererà un errore.

Ricordare :Il compilatore crea il costruttore predefinito per la tua classe solo se quella classe non contiene altri costruttori.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top