Perché un costruttore dovrebbe essere una classe interna invece che un proprio file di classe?

19

Molti esempi di Builder Pattern rendono Builder una classe interna dell'oggetto che costruisce.

Questo ha senso dal momento che indica cosa costruisce Builder . Tuttavia, in un linguaggio tipizzato staticamente sappiamo quali build Builder .

D'altra parte se Builder è una classe interna, tu dovresti sapere quale classe la Builder costruisce senza guardare all'interno di Builder .

Inoltre, avere il builder come classe interna riduce il numero di importazioni poiché può essere referenziato dalla classe esterna, se ci tieni.

E poi ci sono esempi pratici in cui Builder è nello stesso pacchetto, ma non una classe interna, come StringBuilder . Sai che Builder dovrebbe creare un String perché è stato chiamato così.

Detto questo, l'unica buona ragione per cui posso pensare di fare una Builder di una classe interna è che tu sai quale sia la classe ' Builder senza conoscere il suo nome o fare affidamento sulle convenzioni di denominazione. Ad esempio, se StringBuilder era una classe interna di String probabilmente avrei saputo che esisteva prima di quanto facevo io (speculativo).

Ci sono altri motivi per rendere la Builder una classe interiore o si riduce a preferenze e rituali?

    
posta Nathanial 23.01.2014 - 17:45
fonte

2 risposte

26

Penso che la ragione per fare ciò sia che la classe interna (il Builder) possa accedere ai membri privati della classe che sta costruendo.

Da link

Non-static nested classes (inner classes) have access to other members of the enclosing class, even if they are declared private.

...

Consider two top-level classes, A and B, where B needs access to members of A that would otherwise be declared private. By hiding class B within class A, A's members can be declared private and B can access them.

...

As with instance methods and variables, an inner class is associated with an instance of its enclosing class and has direct access to that object's methods and fields.

Ecco un codice per provare a illustrare questo:

class Example {

    private int x;

    public int getX() { return this.x; }

    public static class Builder {

        public Example Create() {
            Example instance = new Example();
            instance.x = 5; // Builder can access Example's private member variable
            return instance;
        }
    }
}

Come classe statica, Builder non ha un'istanza specifica di Esempio a cui è legata. Tuttavia, data un'istanza di Example (o una che crea da sé) Builder può ancora accedere ai membri privati di quell'istanza.

    
risposta data 23.01.2014 - 17:56
fonte
1

In questo caso non c'è "dovrebbe". Definire un builder all'interno di un'altra classe o averlo separato è ortogonale al modello di Builder. Molti esempi lo fanno a causa della convenienza di presentare il codice in un file coerente (anche per accedere ai membri privati, ma ciò dipende anche dal contesto). Sentiti libero di fare altrimenti

    
risposta data 23.01.2014 - 17:57
fonte

Leggi altre domande sui tag