Torna indietro   Hardware Upgrade Forum > Software > Programmazione

ASUS NUC 15 Pro e NUC 15 Pro+, mini PC che fondono completezza e duttilità
ASUS NUC 15 Pro e NUC 15 Pro+, mini PC che fondono completezza e duttilità
NUC 15 Pro e NUC 15 Pro+ sono i due nuovi mini-PC di casa ASUS pensati per uffici e piccole medie imprese. Compatti, potenti e pieni di porte per la massima flessibilità, le due proposte rispondono in pieno alle esigenze attuali e future grazie a una CPU con grafica integrata, accompagnata da una NPU per la gestione di alcuni compiti AI in locale.
Cybersecurity: email, utenti e agenti IA, la nuova visione di Proofpoint
Cybersecurity: email, utenti e agenti IA, la nuova visione di Proofpoint
Dal palco di Proofpoint Protect 2025 emerge la strategia per estendere la protezione dagli utenti agli agenti IA con il lancio di Satori Agents, nuove soluzioni di governance dei dati e partnership rafforzate che ridisegnano il panorama della cybersecurity
Hisense A85N: il ritorno all’OLED è convincente e alla portata di tutti
Hisense A85N: il ritorno all’OLED è convincente e alla portata di tutti
Dopo alcuni anni di assenza dai cataloghi dei suoi televisori, Hisense riporta sul mercato una proposta OLED che punta tutto sul rapporto qualità prezzo. Hisense 55A85N è un televisore completo e versatile che riesce a convincere anche senza raggiungere le vette di televisori di altra fascia (e altro prezzo)
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
Città: TO
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, SCJP 5 (91%) - SCWCD 5 (94%)
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
Città: TO
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, SCJP 5 (91%) - SCWCD 5 (94%)
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


ASUS NUC 15 Pro e NUC 15 Pro+, mini PC che fondono completezza e duttilità ASUS NUC 15 Pro e NUC 15 Pro+, mini PC che fondo...
Cybersecurity: email, utenti e agenti IA, la nuova visione di Proofpoint Cybersecurity: email, utenti e agenti IA, la nuo...
Hisense A85N: il ritorno all’OLED è convincente e alla portata di tutti Hisense A85N: il ritorno all’OLED è convi...
Acer TravelMate P6 14 AI: il Copilot+ PC sotto il chilo per il professionista in movimento Acer TravelMate P6 14 AI: il Copilot+ PC sotto i...
Recensione Borderlands 4, tra divertimento e problemi tecnici Recensione Borderlands 4, tra divertimento e pro...
Xbox Game Pass cambia: nuovi piani e pre...
Intel produrrà chip per AMD? L'in...
Ecco il nuovo Amazon Luna: videogiochi p...
ISRO: prosegue lo sviluppo della navicel...
CoD Black Ops 7 offrirà la beta p...
Il telescopio spaziale James Webb sta ai...
Crucial spinge sui moduli LPCAMM2: fino ...
Imgur blocca gli utenti del Regno Unito:...
ROG Xbox Ally già in consegna: qu...
Ubisoft annuncia Vantage Studios: Assass...
Il solare diventa la prima fonte di elet...
Google Home si rinnova completamente: ar...
Dense Geometry Format (DGF): novit&agrav...
Gemini for Home arriva a ottobre sui dis...
Amazon Smart Air Quality Monitor: a soli...
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: 01:23.


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