Si vous définissez une valeur null/valeur inconnue pour Java énumérations?

Lorsque vous définissez un enum pour quelque chose qui peut être "undefined" dans vos interfaces, si vous

  • définir un distinct valeur d'enum pour cela, ou à
  • suffit d'utiliser enumValue = null pour ces situations?

Par exemple,

serviceX.setPrice(Prix priceEnum)

enum Price {
 CHEAP, EXPENSIVE, VERRRY_EXPENSIVE, UNKNOWN
}

et priceEnum.INCONNU si nécessaire

ou

enum Price {
 CHEAP, EXPENSIVE, VERRRY_EXPENSIVE
}

et priceEnum = null lorsque nécessaire?

D'avoir un peu de débat sur ce point. Quelques points qui me viennent à l'esprit:

  • à l'aide de Prix.INCONNU enregistre quelques "si (prix == null)" du code. Vous pouvez gérer les Prix de x toutes les valeurs dans un seul cas de commutateur
  • En fonction de la vue de la technologie, il peut être plus facile de localiser les Prix.INCONNU
  • à l'aide de Prix.INCONNU genre de causes "nombre magique" problème dans le code, de l'OMI. Ici, nous avons des Prix.INCONNU, d'ailleurs peut-être de Couleur.UNDEFINED, Hauteur.NULLVALUE, etc
  • à l'aide de priceValue = null est plus uniforme avec comment d'autres types de données sont traitées en Java. Nous avons Integer i = null, DomainObject x = null, String s = null pour les valeurs inconnues ainsi, n'est-ce pas?
  • Prix.INCONNU force à vous de décider si la valeur null est autorisée univerally pour tous les cas d'utilisation. On peut avoir de la méthode des Prix getPrice() qui peut retourner des Prix.INCONNU et setPrice(Prix p), ce qui n'est pas autorisé à accepter des Prix.INCONNU. Puisque Le Prix.INCONNU est toujours inclus dans l'énumération de valeurs, ces interfaces air un peu sale. Je sais priceValue = null a le même problème (vous ne pouvez pas définir dans l'interface si null est accepté ou pas) mais il se sent un peu plus propre et un peu moins induire en erreur(?)
  • vous ne pouvez pas utiliser null dans un switch et c'est un inconvénient majeur.
  • Bons points par tous. Réduire le fardeau de la valeur null, la gestion et la capacité d'être plus précis sur ce que "valeur nulle" les moyens sont bons points pro Prix.INCONNU. Aussi, bon point sur "l'objet null modèle", il fait des Prix.INCONNU se sentir comme plus "valide" et communément acceptée de la solution. Mais, personne ne se sent de la même façon sur les Prix.INCONNU aspects négatifs? Je me sens avoir de Prix.INCONNU pollue l'enum de la valeur de consigne. Dire dans showAllPrices(), je ne peux pas énumérer toutes les valeurs de l'enum plus, j'ai à ajouter, si (!Prix.INCONNUE), qui se sent un peu sale et "la magie numbery".
  • @user449236: Si vous n'aimez pas la vérification de cette valeur spéciale, ajouter un display drapeau à chaque enum et de les vérifier à la place. Plus propre et plus flexible.
  • voir, c'est simple, Prendre C par exemple, vous ne pouvez pas avoir une valeur null pour les types enum (comme ils le sont en réalité de vrais int). Dans ma compréhension de la non-déclaration de valeur (c'est à dire nulle) est une mauvaise pratique et généralement une erreur. Non déclarées valeurs ne dites pas que le but est, c'est à dire qu'il doit être ignoré, il a été à la suite d'une erreur (par conséquent et à l'exception devrait [ont] être jetés)
  • Un (très en retard) des commentaires sur cette. Dans mon expérience - si vous écrivez du code qui doit être réutilisé, l'extension ou la partie de l'API, vous aurez à rendre compte de code client en passant ou d'un paramètre null toute façon robuste. Et que généralement réduit par rapport à tous les avantages d'un régime spécial de Foo.Valeur NIL. Il rend également plus difficile d'écrire un type agnostique méthodes / utils, car ils ne le feront pas (en général) être conscient que l'une des valeurs est "spécial".
InformationsquelleAutor user449236 | 2011-08-22