Aujourd'hui, nous allons parler de l'utilisation d'énumérations de chaînes, et plus particulièrement des
enum
classes qui organisent l'interaction avec les constantes de chaîne.
Utilisation d'énumérations de chaînes
Lors du développement d'applications, vous devez périodiquement opérer sur un ensemble fixe de valeurs de chaîne. Cela pourrait être n'importe quoi. Par exemple, une liste de codes couleurs pris en charge par l'application, ou une liste d'appareils avec lesquels notre application peut interagir, les saisons, etc. Tout cela est un ensemble prédéfini de constantes de chaîne avec une structure commune, avec laquelle il est nécessaire d'établir une interaction de programme au niveau du code Java. Lorsque vous devez interagir avec un ensemble prédéfini de constantes de chaîne (et autres), la meilleure solution consiste à écrire votre propreenum
classe. Ci-dessous, nous examinerons des exemples de conversion enum
en string
.
Création d'énumérations de chaînes
Créonsenum
une classe qui stocke une liste des différents environnements pour déployer l'application, ainsi que l'URL de chaque environnement :
public enum Environment {
PROD("https://release.application.com/"),
TEST("https://test.application.com/"),
AUTO_TEST("https://autotest.application.com/"),
DEV("http://localhost:8080");
private final String url;
Environment(String url) {
this.url = url;
}
public String getUrl() {
return url;
}
}
Dans cette classe nous avons défini 4 environnements :
PROD
- libérerTEST
— pour les tests manuelsAUTO_TEST
— environnement pour les autotestsDEV
— local pour le développement et le débogage
- Chaque URL est une constante chaîne dans notre énumération : elles sont définies entre parenthèses à côté de chaque
enum
constante. - Il doit y avoir un constructeur qui prend un argument du même type que chaque
enum
constante. - La portée du constructeur est
private
soitpackage private
. - Il est nécessaire de définir une variable - un champ de classe qui stockera les constantes chaîne que nous avons définies. Vous devez créer une méthode getter pour ce champ afin d'utiliser les valeurs des constantes chaîne en externe.
Itération sur les énumérations de chaînes
À ce stade, nous pouvons déjà parcourir toutesenum
les valeurs disponibles, ainsi qu'obtenir les constantes de chaîne qui leur sont associées. Pour obtenir toutes les valeurs d'une enum
classe, vous devez utiliser la méthode values()
:
public class Main {
public static void main(String[] args) {
for (Environment env : Environment.values()) {
System.out.println(env + " : " + env.getUrl());
}
}
}
Conclusion:
PROD : https://release.application.com/
TEST : https://test.application.com/
AUTO_TEST : https://autotest.application.com/
DEV : http://localhost:8080
Comme le montre l'exemple, pour imprimer le nom de enum
la constante, nous l'avons passé à la méthode System.out.println
, et pour imprimer l'url associée à cette constante, nous avons utilisé le getter que nous avons défini.
Obtenir une constante de chaîne à partir d'une énumération
Pour obtenir la valeur d’une constante chaîne, nous pouvons également appeler un getter sur n’importe quelleenum
constante :
public class Main {
public static void main(String[] args) {
String prodUrl = Environment.PROD.getUrl();
String devUrl = Environment.DEV.getUrl();
System.out.println("Production url is: " + prodUrl);
System.out.println("Development url is: " + devUrl);
}
}
Conclusion:
Production url is: https://release.application.com/
Development url is: http://localhost:8080
Obtenir une constante enum par nom
Parfois, il est nécessaire d'obtenirenum
une constante par son nom de chaîne. Cela se fait à l'aide de la méthode valueOf(String)
, qui renvoie une constante par son nom :
public class Main {
public static void main(String[] args) {
Environment prod = Environment.valueOf("PROD");
Environment dev = Environment.valueOf("DEV");
System.out.println("Production url is: " + prod.getUrl());
System.out.println("Development url is: " + dev.getUrl());
}
}
Conclusion:
Production url is: https://release.application.com/
Development url is: http://localhost:8080
Mais la prudence est de mise ici. Si la méthode ne trouve pas enum
de constante portant le nom spécifié, une exception sera levée java.lang.IllegalArgumentException
.
Conversion d'une chaîne en énumération
Parfois, le besoin inverse surgit. Connaissant la valeurenum
, obtenez enum
la constante elle-même. Ceux. dans notre exemple, connaissant une certaine adresse, vous devez obtenir la Environment
constante correspondante. Il existe plusieurs options pour ce faire. Et tous nécessitent une amélioration dans enum
la classe elle-même. Option 1. Énumération à l'intérieur de la classe. Vous devez créer une méthode qui acceptera une chaîne et la comparera avec toutes les valeurs enum
de la classe. S'il y a une correspondance, la méthode renverra l'énumération souhaitée. Pour notre exemple, nous devons Environment
créer la méthode suivante dans la classe :
public static Environment getEnvByUrl(String url) {
for (Environment env : values()) {
// либо equalsIgnoreCase, на ваше усмотрение
if (env.getUrl().equals(url)) {
return env;
}
}
// Либо просто вернуть null
throw new IllegalArgumentException("No enum found with url: [" + url + "]");
}
Ensuite, nous pouvons obtenir enum
de la chaîne comme ceci :
public class Main {
public static void main(String[] args) {
String url = "http://localhost:8080";
Environment env = Environment.getEnvByUrl(url);
System.out.println("Environment name for url=[" + url + "] is: " + env);
}
}
Conclusion:
Environment name for url=[http://localhost:8080] is: DEV
Cette approche a ses inconvénients. A chaque fois, pour obtenir enum
une constante, il faudra parcourir toutes les valeurs et faire un certain nombre de comparaisons. La pénalité de performance dans ce cas sera déterminée par le nombre de constantes et le nombre d'opérations similaires. La deuxième méthode pour résoudre ce problème ne pose pas ce problème. Code de classe completEnum
:
public enum Environment {
PROD("https://release.application.com/"),
TEST("https://test.application.com/"),
AUTO_TEST("https://autotest.application.com/"),
DEV("http://localhost:8080");
private final String url;
Environment(String url) {
this.url = url;
}
public String getUrl() {
return url;
}
public static Environment getEnvByUrl(String url) {
for (Environment env : values()) {
if (env.getUrl().equals(url)) {
return env;
}
}
throw new IllegalArgumentException("No enum found with url: [" + url + "]");
}
}
Option 2 : Utilisation HashMap
Dans ce cas, nous créons une carte à l'intérieur de notre énumération et la remplissons une fois au moment de la compilation, puis en extrayons les valeurs :
public enum Environment {
PROD("https://release.application.com/"),
TEST("https://test.application.com/"),
AUTO_TEST("https://autotest.application.com/"),
DEV("http://localhost:8080");
private final String url;
Environment(String url) {
this.url = url;
}
public String getUrl() {
return url;
}
// Создаем static final карту
private static final Map<String, Environment> LOOKUP_MAP = new HashMap<>();
// Заполняем её всеми значениями
static {
for (Environment env : values()) {
LOOKUP_MAP.put(env.getUrl(), env);
}
}
// Возвращаем Environment по строковому url
public static Environment getEnvByUrl(String url) {
return LOOKUP_MAP.get(url);
}
}
En termes d'utilisation, les deux options sont identiques :
public class Main {
public static void main(String[] args) {
String url = "http://localhost:8080";
Environment env = Environment.getEnvByUrl(url);
System.out.println("Environment name for url=[" + url + "] is: " + env);
}
}
Conclusion:
Environment name for url=[http://localhost:8080] is: DEV
Mais cette méthode présente aussi des inconvénients. Premièrement, il y a beaucoup plus de code. Et deuxièmement, HashMap
toutes enum
les valeurs seront stockées en permanence dans la mémoire de l'application. Comme vous pouvez le constater, tout a des avantages et des inconvénients. Mais étant donné que enum
les classes stockent généralement moins de valeurs, les inconvénients seront presque invisibles. Il y a une mise en garde : si une telle opération (obtention d'une valeur Java Enum by String) est effectuée fréquemment, il est préférable d'utiliser la deuxième option. Vous pouvez en apprendre davantage sur ce sujet et Enum
sur les cours en général dans le cours JavaRush. Les étudiants apprennent JavaRush Enum
dès le premier cours du cinquième niveau .
GO TO FULL VERSION