Accueil > Java, Programmation > N’exposer que les méthodes publiques de vos API Java

N’exposer que les méthodes publiques de vos API Java

21/05/2010 jmguilla Editer

This post is also available in: Anglais

Patron Accesseur

Tout les développeurs ont toujours voulu séparer logiquement leur code en packages bien distincts afin de rassembler les classes ayant une sémantique commune pour l’API. Se pose alors une question: “comment ne pas créer de méthodes publiques pour qu’elles ne soient pas publiées avec mon API, et exposer ses fonctionnalités aux classes d’autres packages?”. En Java il existe 4 modifiers de méthodes: Public, Protected, Package et Private. Il manque en fait le modifier, appelons le “Friendly”, qui autoriserait l’appel de méthodes d’autres packages seulement aux classes amies. Cela permettrait de résoudre à la fois les problèmes liés à la séparation du code et à la publication de méthodes d’API. Voici un exemple de patron Accessor:

package jean.michel.guillaume.api;
 
/**
 * class part of the public API, every one can use it
 */
public final class RMCore {
    static {
        Accessor.setDefault(new AccessorImpl());
    }
 
    /** Anyone can change value of the item. */
    public void addNode(String url) {
        //impl
    }
 
    /** Only friends can notify node changes.  */
    void notifyNodeUpdate(String url) {
        //impl
    }
}
package jean.michel.guillaume;
 
/**
 * We'll use this class to expose methods in separate packages
 */
public abstract class Accessor {
    private static volatile Accessor DEFAULT;
    public static Accessor getDefault(){
        Accessor a = DEFAULT;
        if( a != null){
            return a;
        }
        try{
            Class.forName(RMCore.class.getName(), true, RMCore.class.getClassLoader());
        }catch(Exception e){
            e.printStackTrace();
        }
        return DEFAULT;
    }
 
    public static void setDefault(Accessor a){
        if( DEFAULT != null){
            throw new IllegalStateException();
        }
        DEFAULT = a;
    }
 
    protected abstract void void notifyNodeUpdate(String url);
}
package jean.michel.guillaume.api;
 
import jean.michel.guillaume.Accessor;
 
/**
 * Now, we can just implement our own Accessor in a separate package
 * to gain access to friendly methods!! Don't forget to declare AccessorImpl
 * package private!!
 */
final class AccessorImpl extends Accessor {
 
    protected void notifyNodeUpate(String url) {
 
    }
}
Categories: Java, Programmation Tags: ,
Les commentaires sont fermés.