Supposons que vous maintenir une API qui a été initialement publié il y a quelques années (avant java gagné enum
support) et définit une classe avec des valeurs d'énumération comme ints:Quelle est la meilleure façon de gérer la coexistence du modèle "int enum" avec java enums au fur et à mesure de l'évolution d'une API?
public class VitaminType {
public static final int RETINOL = 0;
public static final int THIAMIN = 1;
public static final int RIBOFLAVIN = 2;
}
Au fil des années, l'API a évolué et gagné Java Les fonctionnalités spécifiques à 5 (interfaces générées, etc.). Maintenant, vous êtes sur le point d'ajouter une nouvelle énumération:
public enum NutrientType {
AMINO_ACID, SATURATED_FAT, UNSATURATED_FAT, CARBOHYDRATE;
}
Le « style ancien » modèle int-ENUM n'a pas de sécurité de type, aucune possibilité d'ajouter des comportements ou des données, etc, mais il est publié et utilisé . Je suis préoccupé par le fait que le mélange de deux styles d'énumération est incohérent pour les utilisateurs de l'API.
Je vois trois approches possibles:
Donnez et définir la nouvelle ENUM (
NutrientType
dans mon exemple fictif) comme une série de ints comme la classeVitaminType
. Vous obtenez la cohérence, mais vous ne profitez pas de la sécurité de type et d'autres fonctionnalités modernes.décident de vivre avec une incohérence dans une API publiée: garder
VitaminType
autour comme il est, et ajouterNutrientType
commeenum
. Les méthodes qui prennent unVitaminType
sont toujours déclarées comme prenant un int, les méthodes qui prennent unNutrientType
sont déclarées comme prenant un tel. Déposez la classeVitaminType
et présentez une nouvelle énumérationVitaminType2
. Définissez le nouveauNutrientType
sous la forme d'une énumération. Félicitations, pour les 2-3 prochaines années, jusqu'à ce que vous puissiez tuer le type obsolète, vous allez devoir gérer les versions obsolètes de chaque méthode qui a pris unVitaminType
en tant qu'int et en ajoutant une nouvelle version defoo(VitaminType2 v)
. Vous devez également écrire des tests pour chaque méthode obsolètefoo(int v)
ainsi que sa méthodefoo(VitaminType2 v)
correspondante, de sorte que vous venez de multiplier votre effort d'assurance qualité.
Quelle est la meilleure approche?