Torna indietro   Hardware Upgrade Forum > Software > Programmazione

L'Europa conta nella tecnologia e può essere autonoma. Cosa si è detto al Nextcloud Summit 2026
L'Europa conta nella tecnologia e può essere autonoma. Cosa si è detto al Nextcloud Summit 2026
La parola d'ordine al Nextcloud Summit 2026, che si è tenuto a Monaco, è stata "sovranità". Non come è spesso usato questo termine in politica ma, al contrario, come capacità positiva di decidere il proprio destino tecnologico, con modalità collaborative e aperte. L'Europa dice già molto nel mondo open source, che viene visto come mezzo per ottenere la tanto agognata autonomia digitale
Dreame X60 Pro Ultra Complete: i bracci si estendono sempre di più
Dreame X60 Pro Ultra Complete: i bracci si estendono sempre di più
Dreame X60 Pro Ultra Complete implementa due bracci estensibili, per spazzola e moccio, che si spingono ben oltre quanto visto sino ad oggi permettendo una pulizia di casa ancor più capillare e precisa
TCL 65C8L, la recensione del SQD-Mini LED da 4400 nit misurati
TCL 65C8L, la recensione del SQD-Mini LED da 4400 nit misurati
La tecnologia SQD-Mini LED di TCL arriva sul taglio da 65 pollici con la serie C8L: 2040 zone, pannello WHVA 2.0 e un picco che alle rilevazioni delle sonde tocca i 4400 nit nel profilo Filmmaker e un HDR quasi perfetto
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 11-03-2007, 09:49   #1
massib86
Junior Member
 
Iscritto dal: Mar 2007
Messaggi: 22
[java] interfaccia Cloneable

Non riesco a capire a cosa potrebbe servire l'interfaccia Cloneable!

non ha nessun metodo, e inoltre sembra che tutte le classi la estendano!!!
o mi sbaglio??!!
massib86 è offline   Rispondi citando il messaggio o parte di esso
Old 11-03-2007, 10:09   #2
Mixmar
Senior Member
 
L'Avatar di Mixmar
 
Iscritto dal: Feb 2002
Città: Trento
Messaggi: 962
Come dicono le specifiche, se una classe non estende l'interfaccia "Cloneable", non è possibile invocare il metodo "clone()" della classe Object, che tutti gli oggetti naturalmente ereditano.

Il metodo "clone()" (ma dalla tua domanda penso che tu lo sappia già) serve per tutti i casi in cui si voglia ottenere una "copia di lavoro" di un'oggetto su cui operare senza alterare il contenuto dell'originale: altrimenti, ricordando che ciò che viene passato nelle chiamate ai metodi è un riferimento all'oggetto stesso (salvo il caso dei tipi elementari), qualsiasi azione che ne alteri lo stato risulterà "visibile" anche su tutti i dententori dei riferimenti all'oggetto medesimo, con conseguenze spesso indesiderabili.

Il metodo "clone()" della classe Object inoltre è un metodo generico di copia degli oggetti, e in quanto tale non è adatto a tutte le tipologie di classi che si possono creare: è meglio, in caso di incertezza, fare l'override del metodo clone nella classe che implementa l'interfaccia Cloneable, in maniera che la copia sia "informata" della struttura dell'oggetto che sta copiando e pertanto la procedura sia al contempo corretta e completa.
__________________
"Et Eärallo Endorenna utúlien. Sinome maruvan ar Hildinyar tenn' Ambar-metta!" -- Aragorn Elessar, Heir of Isildur
Mixmar -- OpenSuSE 11.1 on AMD 64 3000+ on DFI LanParty nF4-D | GeForce 6600 GT + Thermaltake Schooner on Samsung 710N
Storage -- ( 2 x Hitachi Deskstar 80 Gb + 1 x Hitachi 250 Gb ) = 1 RAID 5 + 1 Storage space LaCie Ethernet Disk Mini 250 Gb | HP - DV2150 EL MILAN CLAN
Mixmar è offline   Rispondi citando il messaggio o parte di esso
Old 11-03-2007, 14:33   #3
massib86
Junior Member
 
Iscritto dal: Mar 2007
Messaggi: 22
clone su E

ok... ma se devo clonare un oggetto generico? ad esempio :
ho un dato definito così
E elemento1
che viene inizializzato nel main, e devo fare un clone di elemento1 e metterlo in elemento2. Come si fa?
il compilatore mi dice che clone è definito protected in Object (giustamente), ma allora come faccio ad usare clone() su elemento1 ?
massib86 è offline   Rispondi citando il messaggio o parte di esso
Old 12-03-2007, 08:19   #4
Mixmar
Senior Member
 
L'Avatar di Mixmar
 
Iscritto dal: Feb 2002
Città: Trento
Messaggi: 962
Quote:
Originariamente inviato da massib86 Guarda i messaggi
ok... ma se devo clonare un oggetto generico? ad esempio :
ho un dato definito così
E elemento1
che viene inizializzato nel main, e devo fare un clone di elemento1 e metterlo in elemento2. Come si fa?
il compilatore mi dice che clone è definito protected in Object (giustamente), ma allora come faccio ad usare clone() su elemento1 ?
Forse il tuo problema è che non conosci il tipo di E a runtime, cioè non sai se E implementi o meno Cloneable?

Oppure "E" è un tipo generico?
__________________
"Et Eärallo Endorenna utúlien. Sinome maruvan ar Hildinyar tenn' Ambar-metta!" -- Aragorn Elessar, Heir of Isildur
Mixmar -- OpenSuSE 11.1 on AMD 64 3000+ on DFI LanParty nF4-D | GeForce 6600 GT + Thermaltake Schooner on Samsung 710N
Storage -- ( 2 x Hitachi Deskstar 80 Gb + 1 x Hitachi 250 Gb ) = 1 RAID 5 + 1 Storage space LaCie Ethernet Disk Mini 250 Gb | HP - DV2150 EL MILAN CLAN
Mixmar è offline   Rispondi citando il messaggio o parte di esso
Old 12-03-2007, 09:09   #5
massib86
Junior Member
 
Iscritto dal: Mar 2007
Messaggi: 22
la seconda!... "E" è un tipo generico (i generics...)
Questo problema mi sta facendo impazzire!
massib86 è offline   Rispondi citando il messaggio o parte di esso
Old 12-03-2007, 09:38   #6
Mixmar
Senior Member
 
L'Avatar di Mixmar
 
Iscritto dal: Feb 2002
Città: Trento
Messaggi: 962
Boh... non potresti semplicemente provare a clonare l'oggetto e lanciare la "CloneNotSupportedException" in caso che E non sia Cloneable?

Il fatto è che, o sei sicuro per le tue specifiche che ogni E è Cloneable oppure può darsi che qualche E non lo sia: in tal caso sarebbe corretto informare l'utilizzatore dell'errore. Sul come poi, vedi tu...
__________________
"Et Eärallo Endorenna utúlien. Sinome maruvan ar Hildinyar tenn' Ambar-metta!" -- Aragorn Elessar, Heir of Isildur
Mixmar -- OpenSuSE 11.1 on AMD 64 3000+ on DFI LanParty nF4-D | GeForce 6600 GT + Thermaltake Schooner on Samsung 710N
Storage -- ( 2 x Hitachi Deskstar 80 Gb + 1 x Hitachi 250 Gb ) = 1 RAID 5 + 1 Storage space LaCie Ethernet Disk Mini 250 Gb | HP - DV2150 EL MILAN CLAN
Mixmar è offline   Rispondi citando il messaggio o parte di esso
Old 12-03-2007, 10:31   #7
massib86
Junior Member
 
Iscritto dal: Mar 2007
Messaggi: 22
ho già provato a fare così, ma siccome E è generico il compilatore mi da errore dicendomi che E non può utilizzare la clone di Object perchè protected... (il programma non si eseguirà mai così!!)

inoltre se faccio un instanceof Clonable sull'oggetto di tipo E per vedere se implementa l'interfaccia, mi dà sempre una risposta positiva (in quanto l'interfaccia Cloneable non contiene nessun metodo), quindi mi eseguira la clone() anche se è un oggetto che non sovrascrive il metodo!
massib86 è offline   Rispondi citando il messaggio o parte di esso
Old 12-03-2007, 10:57   #8
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Messaggi: 5206
Quote:
Originariamente inviato da massib86 Guarda i messaggi
siccome E è generico il compilatore mi da errore dicendomi che E non può utilizzare la clone di Object perchè protected... (il programma non si eseguirà mai così!!)
Credo che l'unica soluzione sia usare la "reflection". Prendi la classe dell'oggetto "generico", cerchi il metodo "clone" e se c'è lo invochi.
__________________
Andrea, Senior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
Java Versions Cheat Sheet
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 12-03-2007, 11:31   #9
Mixmar
Senior Member
 
L'Avatar di Mixmar
 
Iscritto dal: Feb 2002
Città: Trento
Messaggi: 962
Quote:
Originariamente inviato da massib86 Guarda i messaggi
ho già provato a fare così, ma siccome E è generico il compilatore mi da errore dicendomi che E non può utilizzare la clone di Object perchè protected... (il programma non si eseguirà mai così!!)

inoltre se faccio un instanceof Clonable sull'oggetto di tipo E per vedere se implementa l'interfaccia, mi dà sempre una risposta positiva (in quanto l'interfaccia Cloneable non contiene nessun metodo), quindi mi eseguira la clone() anche se è un oggetto che non sovrascrive il metodo!
O fai come ha detto andbin, oppure forse questo codice ti dovrebbe dare, male che vada, una ClassCastException:

Codice:
elemento2 = (E)((Cloneable)elemento1).clone();
Non sono sicuro che funzioni però...
__________________
"Et Eärallo Endorenna utúlien. Sinome maruvan ar Hildinyar tenn' Ambar-metta!" -- Aragorn Elessar, Heir of Isildur
Mixmar -- OpenSuSE 11.1 on AMD 64 3000+ on DFI LanParty nF4-D | GeForce 6600 GT + Thermaltake Schooner on Samsung 710N
Storage -- ( 2 x Hitachi Deskstar 80 Gb + 1 x Hitachi 250 Gb ) = 1 RAID 5 + 1 Storage space LaCie Ethernet Disk Mini 250 Gb | HP - DV2150 EL MILAN CLAN
Mixmar è offline   Rispondi citando il messaggio o parte di esso
Old 12-03-2007, 13:41   #10
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
Le classi che concretizzano cloneable non sono poi tantissime. Il fatto che non abbia metodi non significa che tutti quanti siano dei Cloneable. E' un marcatore puro, tipo EventListener.

Dichiara E sottotipo di Cloneable e poi usa la clonazione standard.
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me!
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 12-03-2007, 15:56   #11
massib86
Junior Member
 
Iscritto dal: Mar 2007
Messaggi: 22
finalmente ho risolto il problema!!
grazie a Andbin ho usato le reflection e tutto si è risolto...
usare il cast a clonable provocava sempre un errore al compilatore in quanto Cloneable non ha alcun metodo (e quindi neanche clone())..

massib86 è offline   Rispondi citando il messaggio o parte di esso
Old 12-03-2007, 16:41   #12
Mixmar
Senior Member
 
L'Avatar di Mixmar
 
Iscritto dal: Feb 2002
Città: Trento
Messaggi: 962
Quote:
Originariamente inviato da PGI-Bis Guarda i messaggi
Le classi che concretizzano cloneable non sono poi tantissime. Il fatto che non abbia metodi non significa che tutti quanti siano dei Cloneable. E' un marcatore puro, tipo EventListener.

Dichiara E sottotipo di Cloneable e poi usa la clonazione standard.
[Riflessione Pseudo-filosofica sul linguaggio]
Quindi si potrebbe considerare "Cloneable" un annotation "sui generis" (mi verrebbe da dire "ante litteram") un po' come il modificatore transient?
[/Riflessione Pseudo-filosofica sul linguaggio]
__________________
"Et Eärallo Endorenna utúlien. Sinome maruvan ar Hildinyar tenn' Ambar-metta!" -- Aragorn Elessar, Heir of Isildur
Mixmar -- OpenSuSE 11.1 on AMD 64 3000+ on DFI LanParty nF4-D | GeForce 6600 GT + Thermaltake Schooner on Samsung 710N
Storage -- ( 2 x Hitachi Deskstar 80 Gb + 1 x Hitachi 250 Gb ) = 1 RAID 5 + 1 Storage space LaCie Ethernet Disk Mini 250 Gb | HP - DV2150 EL MILAN CLAN
Mixmar è offline   Rispondi citando il messaggio o parte di esso
Old 12-03-2007, 16:46   #13
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Messaggi: 5206
Io ho provato a fare così:
Codice:
import java.lang.reflect.*;
import java.io.*;
import java.util.*;

public class Prova
{
    public static void main (String[] args)
    {
        try
        {
            // Date e` clonabile
            Contenitore<Date> c = new Contenitore<Date> (new Date ());
            Contenitore<Date> c2 = (Contenitore<Date>) c.clone ();
        }
        catch (Exception e)
        {
            System.out.println (e);
        }

        try
        {
            // File non e` clonabile
            Contenitore<File> c = new Contenitore<File> (new File ("prova"));
            Contenitore<File> c2 = (Contenitore<File>) c.clone ();
        }
        catch (Exception e)
        {
            System.out.println (e);
        }
    }
}


class Contenitore<T> implements Cloneable
{
    private T var;

    public Contenitore (T var)
    {
        this.var = var;
    }

    public Object clone ()
        throws CloneNotSupportedException
    {
        Contenitore<T> newobj = (Contenitore<T>) super.clone ();

        if (var != null)
            newobj.var = (T) cloneObj (var);

        return newobj;
    }

    private Object cloneObj (Object o)
        throws CloneNotSupportedException
    {
        try
        {
            Class<?> cl = o.getClass ();
            Method m = cl.getMethod ("clone", new Class[0]);
            return m.invoke (o, new Object[0]);
        }
        catch (NoSuchMethodException e)
        {
            throw new CloneNotSupportedException ();
        }
        catch (IllegalAccessException e)
        {
            throw new CloneNotSupportedException ();
        }
        catch (InvocationTargetException e)
        {
            throw new CloneNotSupportedException ();
        }
    }

    public T getVar ()
    {
        return var;
    }

    public void setVar (T var)
    {
        this.var = var;
    }
}
È corretto ciò che ho fatto?? Aspetto conferme (specialmente da PGI-Bis )
__________________
Andrea, Senior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
Java Versions Cheat Sheet
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 12-03-2007, 18:10   #14
massib86
Junior Member
 
Iscritto dal: Mar 2007
Messaggi: 22
anche secondo me... Cloneable non è altro che una descrizione/proprietà di una classe con la quale si dice che dentro è sovrascritto il metodo clone (messo public anzichè di private). Per il resto l'interfaccia non ha niente dentro; mi viene da pensare che sia molto simile ad una classe astratta!
massib86 è offline   Rispondi citando il messaggio o parte di esso
Old 12-03-2007, 18:14   #15
massib86
Junior Member
 
Iscritto dal: Mar 2007
Messaggi: 22
Quote:
Originariamente inviato da andbin Guarda i messaggi
Io ho provato a fare così:


È corretto ciò che ho fatto?? Aspetto conferme (specialmente da PGI-Bis )


anche io ho fatto praticamente così, mi sembra la cosa più giusta!!!
massib86 è offline   Rispondi citando il messaggio o parte di esso
Old 12-03-2007, 19:56   #16
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
Potreste usare:

public class Contenitore<T extends Cloneable> implements Cloneable {...

Formalmente questo assicura che la clonazione di T non produca mai una CloneNotSupportedException (ammesso che chi ha scritto la classe T che implementa Cloneable rispetti lo standard della clonazione in Java).

Per invocare un metodo pubblico senza argomenti:

val.getClass().getMethod("clone").invoke(val);

Continuo a preferire il costruttore di copie .
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me!
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 12-03-2007, 22:16   #17
massib86
Junior Member
 
Iscritto dal: Mar 2007
Messaggi: 22
Quote:
Originariamente inviato da PGI-Bis Guarda i messaggi
Potreste usare:

public class Contenitore<T extends Cloneable> implements Cloneable {...

Formalmente questo assicura che la clonazione di T non produca mai una CloneNotSupportedException (ammesso che chi ha scritto la classe T che implementa Cloneable rispetti lo standard della clonazione in Java).

Per invocare un metodo pubblico senza argomenti:

val.getClass().getMethod("clone").invoke(val);

Continuo a preferire il costruttore di copie .
Si può usare tranquillamente <T extends Cloneable>, ma in questo caso farlo o meno non cambia assolutamente niente visto che il controllo che esista una classe clone sovrascritta lo si fà nella reflection!
Grazie cmq di avermi detto come si invoca il metodo pubblico senza argomenti!
massib86 è offline   Rispondi citando il messaggio o parte di esso
Old 12-03-2007, 23:10   #18
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
Preciso a scanso di equivoci ma è solo una formalità. L'invocazione riflessiva che ho incollato è, per via dei varargs, uguale a quella di andbin. Non ci sono due modi per invocare un metodo pubblico. Ce n'è uno solo .

Introducendo un limite nella dichiarazione del tipo generico ottieni un controllo di compatibilità in compilazione. C'è tutta la diatriba sulla tip(azione/izzazione) statica dietro e se andiamo in giro declamando "tanto il controllo lo fa in esecuzione" c'è il rischio che volino coltellate tra le scapole. Io parteggio per il versante dinamico ma occhi aperti che gli statici son agguerriti .
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me!
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 13-03-2007, 08:10   #19
massib86
Junior Member
 
Iscritto dal: Mar 2007
Messaggi: 22
meglio aggiungerlo allora... cosi' il codice mi diventa piu' robusto!!
massib86 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


L'Europa conta nella tecnologia e può essere autonoma. Cosa si è detto al Nextcloud Summit 2026 L'Europa conta nella tecnologia e può ess...
Dreame X60 Pro Ultra Complete: i bracci si estendono sempre di più Dreame X60 Pro Ultra Complete: i bracci si esten...
TCL 65C8L, la recensione del SQD-Mini LED da 4400 nit misurati TCL 65C8L, la recensione del SQD-Mini LED da 440...
MSI Maestro 500 Wireless: ANC e 90 ore di autonomia a 70 euro MSI Maestro 500 Wireless: ANC e 90 ore di autono...
NL-LC1 è il primo dissipatore a liquido AIO di Noctua: silenzio è la parola d'ordine NL-LC1 è il primo dissipatore a liquido A...
L'astronauta ESA Sophie Adenot ha provat...
Leica SL3-P: la full frame più ev...
All'interno della capsula Starfall di Sp...
8BitDo Arcade Controller Pro è il...
Dead or Alive 6 Last Round: una chiusura...
DXC e Anthropic insieme per portare l'IA...
Lenovo presenta nuove soluzioni per l'IA...
OVHcloud potenzia la Quantum Platform: i...
Octopus Energy lancia Nook, la sua gamma...
IBM presenta il primo chip al mondo sott...
Qualcomm Dragonfly debutta nel settore d...
Scopa elettrica Proscenic P11 Ultra+ a 8...
Napoli capitale italiana del calcolo qua...
Emma avrebbe dovuto contribuire alla sov...
Tesco abbandonerà VMware e migrer...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 20:17.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v