2016-04-19 2 views
1

Une application exécutée dans Java 1.8 doit s'exécuter dans quelques boîtes avec Java 1.4. L'application utilise beaucoup de constantes (des milliers d'entre elles) et tout est mis en œuvre en utilisant des énumérations fonctionnelles. Quel est le meilleur moyen de le rendre compatible inverse?Implémentation d'une énumération pour la compatibilité inverse

EDIT:

Je l'ai déjà vu quelques réponses, mais aucun d'entre eux sont satisfaisants. Donc, pour faire comprendre ce que je suis en train de faire ici, s'il vous plaît jeter un oeil à l'un petit exemple ci-dessous

public class SomeType 
{ 
    public enum TYPE 
    { 
     ERROR("allError","4"), 
    INPUT("allInput","5"), 
     OFFLINE("allOffline","6"),; 

     private final String type; 
     private final String desc; 

     TYPE(String type, String desc) 
     { 
      this.type = type; 
      this.desc = desc; 
     } 
     public String getType(){ 
      return this.type; 
     } 
     public String getDesc(){ 
      return this.type; 
     } 
    } 
} 
} 

qui sera consommée par quelque chose comme

for (SomeType.TYPE type: SomeType.TYPE.values()) 
     { 
      if(nodeValue.equalsIgnoreCase(type.getType())) 
      { 
       value=type.getDesc(); 
       break; 
      } 
     } 

Donc, ce ne sera jamais compatible 1.4 et donc je devrais écrire beaucoup de code standard comme expliqué par @Gene dans le lien fourni par lui. Comme il y a tellement de classes comme celle-ci qui contiennent une très grande liste de constantes, je ressens le besoin d'une meilleure approche. La question est donc la recherche d'une meilleure solution.

+1

Consultez ce lien http://stackoverflow.com/questions/1038321/alternative-to-enum-in-java-1-4 – 11thdimension

+1

J'ai montré comment dupliquer la plupart de ce que font enums (y compris les méthodes membres) dans cette réponse http://stackoverflow.com/questions/4709175/what-are-enums-and-why-are-the-useful/15080106#15080106. La principale chose que cette technique ne fait pas est de bien jouer avec 'switch'. Mais vous un commutateur sur une valeur de membre scalaire. – Gene

+0

@ 11thdimension J'ai vu cela. Mais mon problème est plus quand il s'agit de changer de cas. – RBz

Répondre

1

Vous pouvez utiliser une interface dans tous les endroits qui consomment les énumérations - de cette façon, vous n'avez pas besoin de modifier votre implémentation enum dans Java 5+.

public interface Type { 
    String getDesc(); 
    String getType(); 
} 

L'implémentation de l'interface en Java 5+ serait le même:

public enum TYPE implements Type 
{ 
    ERROR("allError","4"), 
    INPUT("allInput","5"), 
    OFFLINE("allOffline","6"),; 

    private final String type; 
    private final String desc; 

    TYPE(String type, String desc) 
    { 
     this.type = type; 
     this.desc = desc; 
    } 
    public String getType(){ 
     return this.type; 
    } 
    public String getDesc(){ 
     return this.type; 
    } 
} 

En Java 5 vous devez mettre en œuvre le type utilisant Enum de apache-communes ou la mise en œuvre personnalisée (le meilleur serait d'avoir un générateur de code prend le ENUM et la convertit en pré-Java 5 classe)

le code consommation:

for (Type type: types) 
    { 
     if(nodeValue.equalsIgnoreCase(type.getType())) 
     { 
      value=type.getDesc(); 
      break; 
     } 
    } 

où types est Type []. Je ne sais pas si vous utilisez des instructions switch, mais les boucles fonctionneront correctement. De cette façon, vous n'auriez pas besoin d'avoir un code séparé pour les consommateurs enum, mais vous devez quand même réécrire l'énumération en Enum.