2013-09-28 19 views
5

Sono curioso di sapere come Java supporta il costruttore di copie e in che modo è diverso da C++? Mi piacerebbe capire l'equivalente Java della logica per eseguire la regola di tre (costruttore di copia, distruttore, operatore di assegnazione) dal lato del compilatore della storia.differenza tra Java e C++ copy constructor

+3

no, java supporta solo i riferimenti alle classi mentre C++ supporta valori e riferimenti, quindi java non supporta i copiatori, i fustri o le operazioni di assegnazione – Kal

+2

@Kal Wrong. Java supporta i costruttori di copia bene, e la maggior parte delle classi Collections li fornisce. – chrylis

+1

@chrylis: costruttori di copie automatiche? Io non la penso così –

risposta

8

Java non ha supporto linguistico specifico per i costruttori di copie. Piuttosto basta codificare lo stato copiando a mano nel costruttore; per esempio.

public class Person { 
    private String firstName; 
    private String lastName; 

    public Person(Person other) { 
     this.firstName = other.firstName; 
     this.lastName = other.lastName; 
    } 
    ... 
} 

Vorrei capire l'equivalente Java della logica di eseguire regola del tre (costruttore di copia, distruttore, operatore di assegnazione) dal lato compilatore della storia.

Il costruttore di copie è come sopra. È davvero solo un modello (semplice) di design.

Java non fornisce un equivalente al caricamento dell'operatore di assegnazione C++. Java supporta l'assegnazione di tipi primitivi e tipi di riferimento, ma non l'assegnazione di oggetti nello stesso modo in cui lo fa C++. È raro che azioni speciali siano necessarie quando si assegna un valore in Java. E nei casi in cui è necessario farlo, è consuetudine mettere la logica in un metodo setter.

Java supporta i metodi finalize, che sono simili per alcuni distruttori C++. Le differenze principali sono che i metodi finalize sono operazioni su oggetti che non fanno riferimento a variabili e in genere vengono chiamati molto tempo dopo che l'ultimo riferimento dell'oggetto è andato fuori dal campo di applicazione.

Tuttavia, è raramente necessità di utilizzare metodi finalize:

  • Java è un linguaggio completamente garbage collection, e la migliore strategia per la gestione della memoria è quello di lasciare che il GC prendersi cura di esso.

  • Altre risorse sono gestite al meglio utilizzando "try/finally" o "try with resources".

per quanto ne so, l'unico suono caso d'uso per finalize metodi è per ripulire le risorse che sono state perse accidentalmente; per esempio. perché qualcuno ha dimenticato di "chiuderli" usando i meccanismi raccomandati.

+0

La copia viene normalmente eseguita per oggetti "value" mutabili, ad esempio MutableRectangle (se è necessario/voluto una classe di questo tipo). Probabilmente non è davvero sensato/utile per oggetti/entità di "identità" come Persona. –

+0

Questo snippet di codice è l'idea giusta ma sarebbe più rivelatore se si eseguisse un'azione di copia profonda in corso, che è lo scopo del costruttore di copie arrotolato a mano. Le stringhe e gli scalari nativi sono troppo facili. –

+1

@ThomasW - è un rapido esempio per mostrare come funziona Java ... non qualcosa che è inteso per avere un senso da una prospettiva di dominio. Per favore concentrati su cosa sta cercando di dire la risposta. –

5

Java ha solo riferimenti agli oggetti. Non è possibile dichiarare oggetti in linea (su stack o in oggetto).

costruttore di copia

Java non ne ha uno. Puoi scriverne uno, ma raramente lo fai.

, distruttore

Java non ne ha uno. Ha finalize() ma questo è altamente sconsigliato.

operatore di assegnazione

Java non ne ha uno per gli oggetti, solo riferimenti a oggetti.

+0

@ johnchen902 Spiacente, è finalize() http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#finalize() –