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 :

Interfaces Java, implémentation et compatibilité


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2013
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2013
    Messages : 3
    Par défaut Interfaces Java, implémentation et compatibilité
    Bonjour,

    Voici une question concernant un problème de compatibilité Java que je rencontre sur l'un des projets sur lequel je travaille.

    Ce projet, comportant un nombre important de modules et de classes, était compilé jusque récemment avec Java 5. Une des classes développées implémente une interface de base (java.xxx) de la librairie runtime possédant une méthode.

    En passant en Java 6, le projet ne compile plus car l'interface de base expose maintenant deux méthodes.

    Ma première solution était d'implémenter la seconde méthode avec un squelette vide, mais dans ce cas, le projet ne compile plus en Java 5, car cette méthode référence des classes qui n'existent pas en Java 5.

    Le serpent se mord donc la queue...

    Une solution simple était de transformer la classe pour ne plus implémenter l'interface (et donc de ne pas avoir à implémenter la méthode inutile), malheureusement cela est irréalisable, car de nombreux appels dans le code du projet utilisent l'interface et pas la classe et cela demanderait un temps considérable à modifier.

    Est-il possible par exemple d'effectuer une compilation sélective en fonction de la version de Java comme on le ferait en C avec des #define?

  2. #2
    Expert éminent
    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
    Billets dans le blog
    1
    Par défaut
    Salut,

    Citation Envoyé par zaxx70 Voir le message
    En passant en Java 6, le projet ne compile plus car l'interface de base expose maintenant deux méthodes.
    Quel est l'interface en question ?
    Parce que normalement les interfaces n'évoluent pas entre deux versions de Java, justement pour éviter ce genre de problème.


    a++

    PS : Sauf à partir de Java 8 qui mettra en place les méthodes par défaut pour pallier à cette contrainte.

  3. #3
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Probablement javax.sql.DataSource qui, depuis 1.6, étend désormais la nouvelle interface java.sql.Wrapper qui introduit deux nouvelles méthodes.
    J'ai eu le problème une fois, ça m'a surpris.

    Pendant la transition 1.5 vers 1.6, j'ai réglé le problème à coup d'introspection : si la fonctionnalité n'est pas trouvée par introspection, on est en 1.5 et la méthode renvoie UnsupportedOperationException (elle ne sera pas appelée de toute façon puisqu'on n'étend pas Wrapper.) Si on la trouve, on s'en sert.

    À noter qu'on peut aussi juste avoir l'approche "non, je ne suis un wrapper de rien." C'est suboptimal mais ça change rien au fonctionnel.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  4. #4
    Expert éminent
    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
    Billets dans le blog
    1
    Par défaut
    En effet...

    Mais en théorie ce devrait être au driver JDBC de te fournir le DataSource en question.


    Maintenant, je ne vois pas en quoi il ne serait pas possible d'implémenter ces méthode quand même en Java 5, du moment qu'on n'utilise pas l'annotation @Override) :
    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
    19
    class MyDataSource implements DataSource {
     
    	// @Override
    	public boolean isWrapperFor(Class<?> iface) throws SQLException {
    		return false;
    	}
     
    	// @Override
    	public <T> T unwrap(Class<T> iface) throws SQLException {
    		throw new UnsupportedOperationException("unwrap");
    	}
     
    	@Override
    	public Connection getConnection() throws SQLException {
    		// TODO
    	}
     
    	...
    }

    a++

  5. #5
    Candidat au Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2013
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2013
    Messages : 3
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    En effet...

    Mais en théorie ce devrait être au driver JDBC de te fournir le DataSource en question.


    Maintenant, je ne vois pas en quoi il ne serait pas possible d'implémenter ces méthode quand même en Java 5, du moment qu'on n'utilise pas l'annotation @Override) :
    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
    19
    class MyDataSource implements DataSource {
     
    	// @Override
    	public boolean isWrapperFor(Class<?> iface) throws SQLException {
    		return false;
    	}
     
    	// @Override
    	public <T> T unwrap(Class<T> iface) throws SQLException {
    		throw new UnsupportedOperationException("unwrap");
    	}
     
    	@Override
    	public Connection getConnection() throws SQLException {
    		// TODO
    	}
     
    	...
    }

    a++
    En fait il ne s'agit pas de DataSource, mais de Connection. Cependant, le problème est similaire. En 1.6, Connection étend Wrapper, donc il faut ajouter les deux méthodes, ce qui ne pose pas de problème. Le problème vient des méthodes s'appuyant sur des classes inexistantes en 1.5:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    NClob createNClob() throws SQLException;
     
    SQLXML createSQLXML() throws SQLException;
     
    void setClientInfo(String name, String value) throws SQLClientInfoException;
     
    ...
    Quoi que je fasse, le compilateur se plaint de ne pas trouver NClob, SQLXML et SQLClientInfoException.

  6. #6
    Expert éminent
    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
    Billets dans le blog
    1
    Par défaut
    Pourquoi tu as besoin d'implémenter java.sql.Connection ?
    Tu développes un driver JDBC ?


    a++

  7. #7
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2013
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2013
    Messages : 36
    Par défaut
    Une façon violente:
    - masquer l'Interface Java6 avec ta propre Interface.
    - la mettre dans un module (meme tout seul)
    - faire une refactorisation massif des imports/noms par ton interface personnalisé.
    - Enfin, si tu utilises Maven, faire une dépendence sur ce module pour la version Java6

    Tu refais la meme "manip" avec une Interface du meme nom mais compatible Java5.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    /*module Java6*/
    public interface B extends A5
     
    /*module Java5*/
    public interface B extend A6
     
    /*les autres modules ne voient que B au lieu de A5*/
    import x.x.B
    public class C implements B
    de toute façon tu devras faire 2 tâches de compilations différentes.

    Edit: suppression des anglicismes...

Discussions similaires

  1. Classe java implémente une interface
    Par chercheur111 dans le forum Général Java
    Réponses: 5
    Dernier message: 13/04/2012, 17h57
  2. Inclure une fenetre OGL dans une interface java
    Par Bart_lx dans le forum OpenGL
    Réponses: 2
    Dernier message: 06/02/2006, 18h14
  3. 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
  4. Réponses: 2
    Dernier message: 08/01/2006, 15h09
  5. [Réseau]Interface Java + .net
    Par norwy dans le forum Général Java
    Réponses: 8
    Dernier message: 20/09/2005, 22h51

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