Créez une énumération haute performance avec des champs et des méthodes comme Java avec JavaScript

Énumération Java

Java enum est très sophistiqué et vous pouvez créer une énumération avec plusieurs champs et méthodes comme suit.

Java.Color.java


enum Color {
	RED("rouge", 255, 0, 0),
	YELLOW("Jaune", 255, 255, 0),
	GRAY("gris", 155, 155, 155);
	Color(String name, int r, int g, int b) {
		this.name = name;
		this.r = r;
		this.g = g;
		this.b = b;
	}
	public String name;
	public int r, g, b;
	public String toHexCode() {
		return String.format("#%02x%02x%02x", r, g, b);
	}
}
System.out.println(Color.YELLOW.toHexCode()); // => "#ffff00"
System.out.println(Color.GRAY.name); // => "gris"

Implémenté en JavaScript

Si vous implémentez ceci docilement avec JavaScript, cela ressemblera sûrement à ceci.

JavaScript.color.js


var Color = (function() {
  var InnerType = function(name, r, g, b) {
    this.name = name;
    this.r = r;
    this.g = g;
    this.b = b;
  };
  InnerType.prototype.toHexCode = function() {
    return '#' + ('00' + this.r.toString(16)).slice(-2) + ('00' + this.g.toString(16)).slice(-2) + ('00' + this.b.toString(16)).slice(-2);
  };
  return {
    RED : new InnerType('rouge', 255, 0, 0),
    YELLOW : new InnerType('Jaune', 255, 255, 0),
    GRAY : new InnerType('gris', 155, 155, 155)
  };
})();
console.log(Color.YELLOW.toHexCode()); // => "#ffff00"
console.log(Color.GRAY.name); // => "gris"

Cela a l'air bien à première vue, mais ... En Java, il est naturel d'utiliser cette énumération comme clé de Map.

Map<Color, Integer> colorNums = new HashMap<>();
colorNums.put(Color.RED, 10);
colorNums.put(Color.YELLOW, 20);
colorNums.put(Color.GRAY, 30);
System.out.println(colorNums.get(Color.RED)); // => "10"
System.out.println(colorNums.get(Color.YELLOW)); // => "20"

Dans la version JavaScript,

var colorNum = {};
colorNum[Color.RED] = 10;
colorNum[Color.YELLOW] = 20;
colorNum[Color.GRAY] = 30;
console.log(colorNum[Color.RED]); // => "30" !!?
console.log(colorNum[Color.YELLOW]); // => "30" !!?

Et il ne se comporte pas comme prévu. Puisque Color.RED, Color.YELLOW et Color.GRAY sont des objets, le toString par défaut de l'objet est appelé lorsqu'il devient la clé du tableau associatif, et tous les trois deviennent «[object Object]». Cause.

Implémenté en JavaScript (version modifiée)

Ainsi, si vous essayez de renvoyer une chaîne de caractères unique pour chacun avec toString comme suit, cela fonctionnera comme prévu.

JavaScript.color_fix.js


var Color = (function() {
  const InnerType = function(name, r, g, b, toStringValue) {
    this.name = name;
    this.r = r;
    this.g = g;
    this.b = b;
    this.toString = function() {
      return toStringValue;
    };
  };
  InnerType.prototype.toHexCode = function() {
    return '#' + ('00' + this.r.toString(16)).slice(-2) + ('00' + this.g.toString(16)).slice(-2) + ('00' + this.b.toString(16)).slice(-2);
  };
  return {
    RED : new InnerType('rouge', 255, 0, 0, 'RED'),
    YELLOW : new InnerType('Jaune', 255, 255, 0, 'YELLOW'),
    GRAY : new InnerType('gris', 155, 155, 155, 'GRAY')
  };
})();
var colorNum = {};
colorNum[Color.RED] = 10;
colorNum[Color.YELLOW] = 20;
colorNum[Color.GRAY] = 30;
console.log(colorNum[Color.RED]); // => "10"
console.log(colorNum[Color.YELLOW]); // => "20"

Je suis heureux.

Implémenté en JavaScript (version ES6)

Cependant, il est un peu décevant de spécifier moi-même la chaîne de caractères pour toString, donc si vous pouvez utiliser ES6, il est préférable de l'automatiser à l'aide de Symbol ().

JavaScript.color_fix_es6.js


const Color = (() => {
  const InnerType = function(name, r, g, b) {
    this.name = name;
    this.r = r;
    this.g = g;
    this.b = b;
    const sym = Symbol();
    this.toString = () => sym;
  };
  InnerType.prototype.toHexCode = function() {
    return '#' + ('00' + this.r.toString(16)).slice(-2) + ('00' + this.g.toString(16)).slice(-2) + ('00' + this.b.toString(16)).slice(-2);
  };
  return {
    RED : new InnerType('rouge', 255, 0, 0),
    YELLOW : new InnerType('Jaune', 255, 255, 0),
    GRAY : new InnerType('gris', 155, 155, 155)
  };
})();

L'énumération de Java est la plus puissante, mais la flexibilité de JavaScript qui peut atteindre presque la même chose est bonne.

Recommended Posts

Créez une énumération haute performance avec des champs et des méthodes comme Java avec JavaScript
Communication socket avec un navigateur Web utilisant Java et JavaScript ②
Communication socket avec un navigateur Web utilisant Java et JavaScript ①
Créer un environnement de développement d'équipe Java et JavaScript (construction d'environnement gradle)
[Java] Créer et appliquer un masque des diapositives
Essayons WebSocket avec Java et javascript!
[Java] Créez un fichier jar compressé et non compressé avec la commande jar
Java et JavaScript
Créer un CSR avec des informations étendues en Java
Créez un tableau d'affichage simple avec Java + MySQL
Créons un processus chronométré avec la minuterie de Java! !!
[Java] Créez quelque chose comme une API de recherche de produits
[Java] Créer une collection avec un seul élément
Préparer un environnement de scraping avec Docker et Java
Comment accéder aux méthodes et champs Java Private
J'ai essayé de créer une fonction / écran d'administrateur de site commercial avec Java et Spring
[Java] Créer un filtre
[Débutant] Créez un jeu compétitif avec des connaissances de base sur Java
Implémentez rapidement singleton avec enum en Java
[Note] Créez un environnement Java à partir de zéro avec docker
Créer un environnement de développement d'équipe Java, JavaScript (résolution de problèmes)
Créez une application JAVA WEB et essayez OMC APM
J'ai essayé de créer un environnement de développement java8 avec Chocolatey
Je veux faire une liste avec kotlin et java!
Je veux créer une fonction avec kotlin et java!
Créer un SlackBot avec AWS lambda et API Gateway en Java
Définir des méthodes abstraites dans l'énumération Java et écrire leur comportement
Étudiez Java: utilisez Timer pour créer quelque chose comme un minuteur de bombe
[Java] Classe générique et méthode générique
Créer une méthode java [Memo] [java11]
[Java] Créer un fichier temporaire
Créez un terrain de jeu avec Xcode 12
Méthodes Java et surcharges de méthodes
Méthodes et classes abstraites Java
Créez un serveur Web simple avec la bibliothèque standard Java com.sun.net.httpserver
Je ne peux pas créer une classe Java avec un nom spécifique dans IntelliJ
Créer une JVM pour la distribution d'applications avec les modules JDK 9 et jlink
[Swift] Créez un projet avec Xcode (ver 12.1) et affichez "Hello, World!"
[Java] Créons un Minecraft Mod 1.16.1 [Ajouter et générer des arbres]
Note n ° 2 "Création d'un historique de recherche avec ArrayList et HashSet" [Java]
[Java] Créons un Minecraft Mod 1.14.4 [9. Ajouter et générer des arbres]
[Java] Créons un Minecraft Mod 1.14.4 [8. Ajouter et générer du minerai]
Créons un mécanisme polymorphe de paramètres avec Generic Dao et Hibernate
À propos des méthodes Java statiques et non statiques
Construire un projet Java avec Gradle
Utiliser java avec MSYS et Cygwin
Traçage distribué avec OpenCensus et Java
[Java] Énumération des branches avec instruction switch
Utilisez JDBC avec Java et Scala.
Créer un projet Java à l'aide d'Eclipse
Sortie PDF et TIFF avec Java 8
[Java] Réduire les instructions if avec Enum
Etudier Java 8 (méthode StaticIF et Default)