IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Java Discussion :

Interface de marquage (Cloneable, Serializable..)


Sujet :

Langage Java

  1. #1
    Membre régulier
    Inscrit en
    Avril 2002
    Messages
    224
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 224
    Points : 116
    Points
    116
    Par défaut Interface de marquage (Cloneable, Serializable..)
    Juste pour info :

    A quoi servent les Interfaces de marquage?
    Si possible, me donner es exemples concret d'utilisation.

    Merci.
    Petit à petit, l'oiseau fait son nid !

  2. #2
    Membre éprouvé
    Profil pro
    Architecte technique
    Inscrit en
    Mars 2002
    Messages
    966
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Mars 2002
    Messages : 966
    Points : 1 085
    Points
    1 085
    Par défaut
    Ces interfaces ne servent à rien , mais juste pour préciser qu'un object rentre dans certaines conditions.
    Dans le cas de la sérialization des objets, la classe ObjectOutputStream...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if (altobj != null && ! (altobj instanceof Serializable)) {
      String clname = altobj.getClass().getName();
      throw new NotSerializableException(clname);
    }

  3. #3
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    Regle generale : une interface sert principalement a definir un type auquel on peut optionnellement attacher des signatures de methodes ou des constantes. Une interface ne definie pas un comportement, en effet il n'est pas possible de mettre du code dans une interface.

    Pour definir un comportement generique, il faut utiliser une classe abstraites.

    => la methode clone() peut etre uniquement appelee sur des objets de type Cloneable. La serialisation peut uniquement s'effectuer sur des objets de type Serializable.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  4. #4
    Nouveau membre du Club
    Inscrit en
    Décembre 2005
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 25
    Points : 29
    Points
    29
    Par défaut définition de la methode clone()
    Citation Envoyé par bouye
    => la methode clone() peut etre uniquement appelee sur des objets de type Cloneable. La serialisation peut uniquement s'effectuer sur des objets de type Serializable.
    Petite question au sujet de clone():

    pourquoi peut-on définir une methode clone() du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    public Object clone() throws CloneNotSupportedException
    {...}
    ...Et si c'est pas bien, pourquoi?...

  5. #5
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,

    Citation Envoyé par mysteriousFreak
    pourquoi peut-on définir une methode clone() du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    public Object clone() throws CloneNotSupportedException
    {...}
    Pourquoi ne pourrait-on pas définir une tel méthode ???

    Citation Envoyé par mysteriousFreak
    ...Et si c'est pas bien, pourquoi?...
    Pourquoi cela ne serait-il pas bien ???



    Un peu plus de détail sur ta question serait peut-être utilise...

    a++

  6. #6
    Nouveau membre du Club
    Inscrit en
    Décembre 2005
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 25
    Points : 29
    Points
    29
    Par défaut
    Citation Envoyé par adiGuba
    Pourquoi ne pourrait-on pas définir une tel méthode ???
    ...Je voulais dire sans implémenter l'interface Cloneable

    Bon, ok, on peut définir une methode quelconque, là-dessus OK, mais en fait il me semblait que normalement on ne définissait cette methode qu'en implémentant l'interface Cloneable... du moins pour faire des choses propres, d'autant que d'apres la Javadoc:
    "Invoking Object's clone method on an instance that does not implement the Cloneable interface results in the exception CloneNotSupportedException being thrown."

    J'ai vu ce genre de trucs (clone() sans Cloneable), ça semble marcher, mais je trouve ça un peu étrange vu la Javadoc...

    Citation Envoyé par adiGuba
    Pourquoi cela ne serait-il pas bien ???
    Je voulais dire sans l'interface Cloneable, c'est pas très propre il me semble... non?...

    PS: t'as raison, c'était quand meme pas très clair ma question, désolé, j'éspère que c'est mieux cette fois-ci

  7. #7
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Oui tu peux très bien faire une méthode clone() qui renvoi une copie de ton objet. Seulement tu devras créer ton même cette objet, par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    class MyObject {
    	private int attrib1;
    	private int attrib2;
    	private int attrib3;
    	private int attrib4;
     
    	public MyObject(int attrib1, int attrib2, int attrib3, int attrib4) {
    		this.attrib1 = attrib1;
    		this.attrib2 = attrib2;
    		this.attrib3 = attrib3;
    		this.attrib4 = attrib4;
    	}
     
    	public Object clone() {
    		return new MyObject(this.attrib1, this.attrib2, this.attrib3, this.attrib4);
    	}
    }
    L'interface Cloneable te permet d'utiliser la méthode super.clone() à la place, et ainsi simplifier un peu la tâche (en particulier pour des classes complexes) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    class MyCloneableObject implements Cloneable {
    	private int attrib1;
    	private int attrib2;
    	private int attrib3;
    	private int attrib4;
     
    	public MyCloneableObject(int attrib1, int attrib2, int attrib3, int attrib4) {
    		this.attrib1 = attrib1;
    		this.attrib2 = attrib2;
    		this.attrib3 = attrib3;
    		this.attrib4 = attrib4;
    	}
     
    	@Override
    	public Object clone() throws CloneNotSupportedException {
    		return super.clone();
    	}
    }
    La méthode super.clone() effectue automatiquement une copie des valeurs des attributs primitifs, et une copie des références des objets, en plus de créer la nouvelle instance en mémoire (sans passer par le constructeur).

    Pour cela la méthode super.clone() vérifie que la classe implémente Cloneable. Si ce n'est pas le cas une CloneNotSupportedException est remonté (et seulement dans ce cas d'ailleurs).

    Au passage, tu peux supprimer cette exception dans ta classe en la traitant, et avec Java 5.0 tu peux même changer le type de retour pour qu'il corresponde à ta classe (lire la FAQ : Quelles sont les règles à respecter pour redéfinir/implémenter une méthode ?), ce qui donnerait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    	public MyCloneableObject clone() {
    		try {
    			return (MyCloneableObject) super.clone();
    		} catch (CloneNotSupportedException e) {
    			// Logiquement, ceci ne devrait pas arriver ici :
    			throw new RuntimeException(e);
    		}
    	}

    a++

  8. #8
    Membre chevronné
    Avatar de professeur shadoko
    Homme Profil pro
    retraité nostalgique Java SE
    Inscrit en
    Juillet 2006
    Messages
    1 257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : retraité nostalgique Java SE

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 257
    Points : 1 855
    Points
    1 855
    Par défaut
    Certaines interfaces de marquages sont un pis-aller dans l'attente de l'apparition des annotations (c'est à dire dans le cadre pre 1.5).
    En effet elles peuvent être utilisées en fait comme meta-annotation.
    Je trouve (mais c'est une opinion très perso) que Serializable entre dans cette catégorie ... avec quelques inconvénients du type: une sous-classe d'une classe Serializable est-elle automatiquement Serializable? (alors que ça pourrait sérieusement se discuter).
    mon impression: il faut tourner son clavier 7 fois entre ses mains avant de définir une interface marqueur (mais dans certains cas ça s'impose).
    J'ai des principes: je peux toujours trouver une bonne raison pour les contredire .... mais j'ai des principes!
    (mon excellent bouquin sur Java : https://eska-publishing.com/fr/livre...822407076.html)

Discussions similaires

  1. Interface de marquage et Enum
    Par brachior dans le forum C#
    Réponses: 23
    Dernier message: 28/06/2011, 11h59
  2. entité jpa et interface serializable
    Par anja87 dans le forum JPA
    Réponses: 1
    Dernier message: 11/11/2010, 13h08
  3. [Débutante] L'interface Serializable
    Par 3asfoura dans le forum Entrée/Sortie
    Réponses: 3
    Dernier message: 22/02/2008, 12h40
  4. Problème avec l'interface java.io.serializable.
    Par mitje dans le forum Entrée/Sortie
    Réponses: 5
    Dernier message: 26/01/2006, 04h19
  5. interface utilisateur avec OpenGL
    Par demis20 dans le forum OpenGL
    Réponses: 6
    Dernier message: 03/10/2002, 12h27

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo