Dichiara un campo come ridondanza forzata finale nei costruttori?

2

Ho la seguente classe abbreviata:

public class Player {
    final private DoubleDuple position;
    final private DoubleDuple momentum;

    public Player() {
        position = new DoubleDuple(0, 0);
        momentum = new DoubleDuple(0, 0);
    }

    public Player(double xPos, double yPos) {
        position = new DoubleDuple(xPos, yPos);
        momentum = new DoubleDuple(0, 0);
    }

    public Player(double xPos, double yPos, double xMom, double yMom) {
        position = new DoubleDuple(xPos, yPos);
        momentum = new DoubleDuple(xMom, yMom);
    }
}

Con i campi elencati come final , non posso semplicemente fare in modo che ogni costruttore più complicato chiami ogni costruttore più semplice, poiché il campo final verrà quindi assegnato due volte; che non è consentito.

Se però, ho rimosso il modificatore final dai campi, potrei cambiare l'ultimo costruttore in:

public Player(double xPos, double yPos, double xMom, double yMom) {
        this(xPos, yPos);
        momentum = new DoubleDuple(xMom, yMom);
}

Che trovo più ordinato. In questo esempio, non è molto di un cambiamento, ma in situazioni in cui ci sono più campi che hanno valori predefiniti, sarebbe bello non dover ripetere me stesso in ogni costruttore (DRY).

Domande:

  • Quando si ha a che fare con i campi di final , c'è un modo per non ripetermi in ogni costruttore?
  • Chiedo a questo di rispettare il principale di DRY (non ripeterlo). Dovrei pensare in questo modo?
posta Carcigenicate 09.08.2015 - 01:41
fonte

1 risposta

8

Il modo in cui di solito lo faccio è codificare solo l'ultimo costruttore, quindi rendere i costruttori più semplici delegare a quello più completo, fornendo valori predefiniti. Quindi, prendendo il tuo esempio, mi piacerebbe così:

public class Player {
    final private DoubleDuple position;
    final private DoubleDuple momentum;

    public Player() {
        this(0, 0, 0, 0);
    }

    public Player(double xPos, double yPos) {
        this(xPos, yPos, 0, 0);
    }

    public Player(double xPos, double yPos, double xMom, double yMom) {
        position = new DoubleDuple(xPos, yPos);
        momentum = new DoubleDuple(xMom, yMom);
    } 
}
    
risposta data 09.08.2015 - 02:06
fonte

Leggi altre domande sui tag