2017-08-24 2 views
0

Je n'ai pas trouvé de meilleur titre (n'hésitez pas à le modifier si vous en trouvez un meilleur), mais le cas d'utilisation est le suivant. J'ai deux listes de constantes. L'un d'entre eux contient les constantes que j'utilise dans mon application, l'autre contient les différentes constantes qui me sont envoyées via un fichier CSV (avec des données).Meilleur moyen d'implémenter un lien entre N constantes

Pour donner un exemple approximatif: dans le fichier CSV, il y a un champ appelé "id du client". Dans mon application, je veux utiliser un champ appelé "clientId". J'ai donc fondamentalement besoin de créer un lien statique entre les deux constantes, de sorte que je puisse facilement passer de l'une à l'autre en fonction de ce que je dois réaliser.

J'ai pensé créer des valeurs Map(String, String) statiques, mais j'ai pensé qu'il pourrait y avoir de meilleures solutions.

Merci!

EDIT: modification du titre en "N" constantes au lieu de 2, car Hashmap ne semble plus être une option dans ce cas.

+0

Quel est le problème avec l'utilisation d'une carte statique alors? – Thomas

+0

Surtout qu'il doit être rempli dans une méthode static() {} qui sera en fait assez laide code si les listes deviennent vraiment longues. Mais ce pourrait être la meilleure solution, je voulais juste être sûr avant de le faire. –

+0

En outre, cette solution ne fonctionnerait pas s'il devait y avoir une 3ème couche dans mon application (comme un fichier que je dois créer et envoyer à un tiers) et donc le besoin de lier 3 constantes ensemble. –

Répondre

1

vous pouvez utiliser le support double langage de innitializer pour maintenir l'initialisation de la carte près de la déclaration de la carte, il serait pas « laid » par exemple:

static Map<String, String> someMap = new HashMap<String, String>() {{ 
     put("one", "two"); 
     put("three", "four"); 
}}; 

Prenez garde que sans le modificateur static chaque classe anonyme (il y en a un créé dans cet exemple) contient une référence à l'objet englobant et si vous donnez une référence à cette carte à une autre classe, cela empêchera la classe englobante d'être garbage collect. Fortunatelly, il y a un espoir pour nous avec Java mise à jour, en java 9, il y aura très pratique Map.of() pour nous aider à le faire plus en toute sécurité.

+0

Attendez QUOI? Quand cette fonctionnalité est-elle ajoutée? Je n'ai jamais su que cela existait! – Sweeper

+0

@Sweeper jeter un coup d'oeil ici: https://stackoverflow.com/questions/1958636/what-is-double-brace-initialization-in-java –

+0

Eh bien, c'est plutôt joli. Je ne savais pas que cela existait non plus, prenez mon upvote pour la science. :) Je commence à utiliser cette atm, si aucune autre/meilleure idée ne se présente dans un moment je l'accepterai comme une réponse. THX ! –

0

La meilleure façon de séparer le mappage de votre code d'application est d'utiliser un fichier propriétés dans lequel vous définissez votre mappage.

Par exemple, vous pourriez avoir un csv-mapping.properties à la racine de vos ressources et de les charger avec le code suivant:

final Properties properties = new Properties(); 

properties.load(this.getClass().getResourceAsStream("/csv-mapping.properties")); 

Cela fonctionne comme une Carte, avec la séparation supplémentaire de code à partir configuration.

0

Il existe de nombreuses méthodes que vous pouvez utiliser pour résoudre facilement ces types de problèmes. L'une des méthodes consiste à utiliser un fichier de propriétés ou un fichier contenant la paire valeur/clé.

Voici le code des propriétés.

import java.util.ResourceBundle; 

public class ReadingPropertiesFile { 
    public static void main(String[] args) { 
     ResourceBundle messages; 
     messages = ResourceBundle.getBundle("msg"); 
     System.out.println(messages.getString("ID")); 
    } 
} 

fichier msg.properties contient des valeurs ::

ID = ClientID. PRODUCT_ID = prod_ID

La sortie du programme est ClientID.

Vous pouvez également lire à partir d'un simple fichier texte. Ou vous pouvez utiliser la carte comme vous utilisez. Mais je vous suggère d'utiliser le fichier de propriétés.

0

Une bonne option serait d'utiliser un ENUM pour créer ces applications Beetween plusieurs constantes à une seule valeur de bon sens, par exemple:

import java.util.Arrays; 
import java.util.Collections; 
import java.util.HashSet; 
import java.util.Set; 

public enum MappingEnum { 
    CLIENT_ID("clientId", "id of the client", "clientId", "IdOfTheClient"), 
    CLIENT_NAME("clientName", "name of the client", "clientName"); 

    private Set<String> aliases; 
    private String commonSenseName; 

    private MappingEnum(String commonSenseName, String... aliases) { 
     this.commonSenseName = commonSenseName; 
     this.aliases = Collections.unmodifiableSet(new HashSet<String>(Arrays.asList(aliases))); 
    } 

    public static MappingEnum fromAlias(String alias) { 
     for (MappingEnum mappingEnum : values()) { 
      if (mappingEnum.getAliases().contains(alias)) { 
       return mappingEnum; 
      } 
     } 
     throw new RuntimeException("No MappingEnum for mapping: " + alias); 
    } 

    public String getCommonSenseName() { 
     return commonSenseName; 
    } 
} 

et vous pouvez l'utiliser comme:

String columnName = "id of the client"; 
String targetFieldName = MappingEnum.fromAlias(columnName).getCommonSenseName();