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() –
- 1. C# Generic Copy Constructor
- 2. java copy constructor ed ereditarietà
- 3. C++ 11 virtual copy constructor
- 4. modello copy constructor
- 5. Differenza tra std :: uninitialized_copy e std :: copy?
- 6. Base Copy constructor non chiamato
- 7. Default Constructor, Java vs C++
- 8. C'è qualche differenza tra C c; e C c = C() ;?
- 9. Differenza di enum tra java e C++?
- 10. Differenza tra ogg-c e java
- 11. Differenza tra C# utilizzando e l'importazione Java
- 12. call copy constructor dall'assegnazione funzione di operatore
- 13. java String constructor logic
- 14. differenza tra java bean e java class?
- 15. Differenza tra c() e append()
- 16. differenza tra iPhone AES (Objective-C) e Java
- 17. Differenza tra Groovy Def e Java Object?
- 18. Una classe con copy-constructor cancellato è banalmente copiabile?
- 19. Differenze tra [NSArray arrayWithArray:] e [NSArray copy]
- 20. Generics Default Constructor Java
- 21. Java: Differenza tra Class.forName e ClassLoader.loadClass
- 22. Differenza tra Immagine e BufferedImage in Java
- 23. Differenza tra NoSuchMethodException e NoSuchMethodError in Java
- 24. Differenza tra PriorityQueue e TreeSet in Java?
- 25. Punto Java, differenza tra getX() e point.x
- 26. Differenza tra RTTI e riflessione in Java
- 27. Java - Differenza tra SwingWorker e SwingUtilities.invokeLater()
- 28. Differenza tra HashMap e Map in Java ..?
- 29. Java: Differenza tra macro e micro benchmark
- 30. Differenza tra Java DateUtils.ceiling e DateUtils.truncate
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ì –