Ho letto Java efficace di Joshua Bloch e finora è all'altezza della sua reputazione. Il primo elemento costituisce un caso convincente per i metodi di produzione statica su . Tanto che ho iniziato a mettere in discussione la validità dei buoni vecchi costruttori :).Abbiamo mai bisogno di preferire i costruttori rispetto ai metodi statici di fabbrica? Se sì, quando?
i vantaggi/svantaggi del libro sono riassunte di seguito:
Vantaggi:
- Hanno nomi!
- Abbiamo totale controllo esempio (Singletons, prestazioni, ecc)
- Essi possono restituire un sottotipo/interfaccia
- compilatore può fornire inferenza
Svantaggi:
- Le classi private non possono essere sottoclasse
- Non si distinguono nella documentazione come costruttore s do
Il primo svantaggio può effettivamente essere una buona cosa (come menzionato nel libro). Il secondo, penso sia solo uno svantaggio minore e può essere risolto facilmente con le prossime versioni java (annotazioni per javadoc ecc.)
Sembra che alla fine i metodi di fabbrica abbiano quasi tutti i vantaggi dei costruttori, molti molti altri vantaggi e nessun vero svantaggio!
Quindi, la mia domanda è sostanzialmente in tre parti:
- E 'buona prassi utilizzare sempre metodi di fabbrica statici di default sopra i costruttori?
- È mai giustificato utilizzare i costruttori?
- Perché i linguaggi orientati agli oggetti non forniscono supporto a livello di lingua per le fabbriche?
Nota: Ci sono due domande simili: When to use a Constructor and when to use getInstance() method (static factory methods)? e Creation of Objects: Constructors or Static Factory Methods. Tuttavia, le risposte o forniscono semplicemente l'elenco sopra riportato o reiterano la logica dietro i metodi statici di fabbrica di cui sono già a conoscenza.
Inoltre, apparentemente le fabbriche hanno anche vantaggi per la sicurezza del filo rispetto ai costruttori secondo [questo] (http://madpropellerhead.com/random/20100328-java-final-fields-are-not-as-final-as- potresti pensare). – MadChuckle
Ho letto l'articolo di riferimento, ma sono giunto alla conclusione opposta dell'autore ... :-) Vedo cosa viene indicato, ma non sono d'accordo. Forse ha a che fare con i casi d'uso specifici che ognuno di noi vede normalmente durante la codifica. –
@BrianKnoblauch, non sono esperto di concorrenza, quindi ti prendo in parola perché gli esempi sembrano un po 'forzati :) – MadChuckle