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
risposta
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.
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. –
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. –
@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. –
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.
@ johnchen902 Spiacente, è finalize() http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#finalize() –
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
@Kal Wrong. Java supporta i costruttori di copia bene, e la maggior parte delle classi Collections li fornisce. – chrylis
@chrylis: costruttori di copie automatiche? Io non la penso così –