J'ai une question Java sur la meilleure méthode pour travailler avec le fichier enum suivant qui m'a été fourni.Java Enum handling
public enum Foo{
PLANE(1, "Plane", "plane"),
CASTLE(2, "Castle", "castle"),
FEILD(3, "Feild", "field"),
ROAD(4, "Road", new String[] {"road", "pavement"});
}
Il y a à peu près entrées 100ish des formats ci-dessus
/**
* Stores a map of the names for fast access. Stores a map of the IDs for fast access.
*/
private static final Map<Integer,BlockType> ids = new HashMap<Integer,BlockType>();
private static final Map<String,BlockType> lookup = new HashMap<String,BlockType>();
private final int id;
private final String name;
private final String[] lookupKeys;
static {
for(Foo type : EnumSet.allOf(Foo.class)) {
ids.put(type.id, type);
for (String key : type.lookupKeys) {
lookup.put(key, type);
}
}
}
/**
* Construct the type.
*
* @param id
* @param name
*/
Foo(int id, String name, String lookupKey) {
this.id = id;
this.name = name;
this.lookupKeys = new String[]{lookupKey};
}
/**
* Construct the type.
*
* @param id
* @param name
*/
Foo(int id, String name, String[] lookupKeys) {
this.id = id;
this.name = name;
this.lookupKeys = lookupKeys;
}
/**
* Return type from ID. May return null.
*
* @param id
* @return
*/
public static Foo fromID(int id) {
return ids.get(id);
}
/**
* Return type from name. May return null.
*
* @param name
* @return
*/
public static Foo lookup(String name) {
return lookup.get(name.toLowerCase());
}
/**
* Get block numeric ID.
*
* @return
*/
public int getID() {
return id;
}
/**
* Get user-friendly name.
*
* @return
*/
public String getName() {
return name;
}
Donc ce que je suis en train de faire avec ce ENUM est la suivante: Un utilisateur émet une commande, par exemple:/rebond 1
Le programme reconnaît bounce comme une commande et cherche l'argument suivant. Puisque 1 suit la commande, il vérifie maintenant que 1 est un identifiant valide # dans l'énumération. Si c'est le cas, il exécute la commande.
Un utilisateur émet une commande pour l'exemple 2 sous la forme suivante:/plan de rebond. Cette fois-ci, il vérifie si la chaîne est un nom de chaîne valide dans l'énumération et si elle est capturée, l'id # lui est associé pour exécuter la commande.
Comment puis-je vérifier pour ces critères que l'ID ou l'un des ID de chaîne existe et toujours retourner l'ID # pour une utilisation ultérieure. Toute aide serait appréciée.
Il convient également de noter que ce fichier enum est son propre fichier de classe indépendant appelé à partir du principal. Merci à tous ceux qui m'ont aidé à me mettre sur la bonne voie, j'ai donné la bonne réponse à Wolfcastle, voici ce que j'ai pu faire pour moi mais je suis toujours ouvert aux critiques sur la logique ou les défauts de performance avec ma méthode.
String s = null;
try {
s = in.readLine();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
id = Integer.parseInt(s);
} catch (NumberFormatException nfe) {
}
if (BlockType.lookup(s) != null
|| BlockType.fromID(id) != null) {
if (BlockType.lookup(s)!= null) {
blockname = BlockType.lookup(s).getName();
blockid = BlockType.lookup(s).getID();
} else {
blockname = BlockType.fromID(id).getName();
blockid = BlockType.fromID(id).getID();
}
}
Ce n'est pas clair pour moi quel est votre problème. Votre code semble devoir faire ce que vous voulez. Pouvez-vous développer le problème réel que vous rencontrez? – wolfcastle
Ceci est un fichier qui me est fourni via une équipe de collaboration pour faire des plugins. Mon paquet utilise l'enum dans ce fichier pour valider que l'item que l'utilisateur essaye de créer existe réellement dans l'enum soit par l'identifiant des éléments, soit par son nom. Si l'utilisateur envoie la commande en utilisant le nom de la chaîne, je dois obtenir l'identifiant de l'article en fonction du nom de la chaîne afin que l'article puisse être créé. (J'espère que cela a plus de sens) – JDD
BlockType est-il le même que Foo? –