Sta usando il costruttore di copie in un costruttore di oggetti cattivo? [duplicare]

1

Leggevo questa pagina sull'uso la parola chiave new nel costruttore e mi chiedevo se si applica ai costruttori di copia per le raccolte.

Supponiamo che abbia una classe Book e una raccolta per archiviare un set di authors .

class Book {

    private String title;
    private Set<Author> authorsSet;

    Book (title, authors){
        this.title = title
        this.authorsSet = Collections.unmodifiableSet(new HashSet<Author>(authors)) 
    }
}

È una buona idea fare una copia difensiva in modo che il codice cliente non possa cambiare gli interni di authorsSet .

Chiama this.authorsSet = Collections.unmodifiableSet(new HashSet<Author>(authors)) una violazione della linea guida che un costruttore non deve chiamare la parola chiave new ? In tal caso, come facciamo una copia difensiva senza la parola chiave new ?

    
posta Piovezan 01.09.2018 - 00:08
fonte

1 risposta

5

Se in un costruttore di classe A un altro oggetto di classe B è costruito da new , allora A ha una dipendenza dura da B, che rende impossibile testare A isolato da B, che può essere risolto iniettando una B istanza in A attraverso un parametro costruttore di un tipo di interfaccia che B implementa. Ma questo è solo un necessario

  • se in realtà vuoi o se hai bisogno di testare l'unità A isolato da B .

Nel caso mostrato, ciò significherebbe test unitario Book isolato dalla classe HashSet - che probabilmente non è ciò che desideri o hai bisogno. Le classi di raccolta come HashSet possono essere trattate come elementi del tuo framework o dei linguaggi di programmazione (in realtà, in alcune lingue come Perl o Python, sono elementi del linguaggio). Sono leggeri, veloci, si può presumere che siano privi di bug per tutti gli scopi pratici, e spesso la maggior parte del codice dipende comunque da loro. Quindi in genere non ha senso rompere una dipendenza da essi.

    
risposta data 01.09.2018 - 08:21
fonte

Leggi altre domande sui tag