web-dev-qa-db-fra.com

Y a-t-il une raison pour laquelle Java.time.ZoneId n'inclut pas une énumération de ZoneIds?

Pour obtenir un ZoneId cela se passe comme:

ZoneId.of("America/Sao_Paulo");

ou

ZoneId.of(ZoneId.SHORT_IDS.get("BET"));

Pourquoi serait la raison de ne pas exister un Enum de telles valeurs, comme:

ZoneId.of(ZoneIds.AMERICA_SAO_PAULO);

qui semble moins sujet aux erreurs et beaucoup plus facile à compléter automatiquement?

25
Renan

Je pense que c'est parce que la liste de tous les noms de fuseaux horaires possibles peut changer quelle que soit la version Java version.

Informations sur le fuseau horaire fourni avec Java (généralement dans le dossier <Java-home>/lib/zi Ou dans le fichier jre/lib/tzdb.dat Dans les versions plus récentes). les informations peuvent être mises à jour sans changer la Java (en utilisant Timezone Updater Tool ) .

Si les données de fuseau horaire sont mises à jour (mais Java reste la même) et qu'un nouvel ID de zone est créé, il n'y aurait pas d'équivalent Enum pour cela, laissant l'API "incomplète ". Et les données de fuseau horaire changent plus rapidement que les mises à jour JDK - même si ce n'est pas le cas, il n'est pas toujours possible de mettre à jour la version JDK dans les environnements de production dès que nous le souhaitons.

Je ne peux pas parler au nom des créateurs d'API, mais je pense qu'ils ont décidé de laisser les choses comme elles sont parce que l'espace de noms peut augmenter plus rapidement que le JDK est mis à jour, et maintenir les énumérations à jour serait une infinité et toujours- travail incomplet.

Si vous voulez vraiment vérifier si un nom de fuseau horaire est valide, vous pouvez faire:

if (ZoneId.getAvailableZoneIds().contains("America/Sao_Paulo")) {
    // America/Sao_Paulo is a valid ID
}

Ou appelez simplement ZoneId.of("zone-name") et récupérez ZoneRulesException.


Je viens d'appeler ZoneId.getAvailableZoneIds() dans JDK 1.8.0_131 et il a 600 entrées. Personne ne voulait probablement créer 600 constantes enum.

On pourrait dire qu'ils auraient pu faire quelque chose de similaire à la classe Java.util.Locale, Qui a quelques entrées pour certaines langues (comme l'anglais, l'allemand, le français, etc.). Mais comment décider quels fuseaux horaires "méritent" une constante? Peut-être qu'ils ont juste décidé de ne pas trop y penser et "hé, oubliez-le, utilisez simplement un String avec le nom de la zone".


Une autre raison possible peut être le fait que la méthode ZoneId.of() a été conçue pour recevoir également des décalages UTC (tels que +05:00, -0300, +09:30:15 Et ainsi de suite) . Étant donné que les décalages acceptent des heures, des minutes et des secondes, il existe des centaines de décalages possibles et la création d'énumérations pour chacun serait impossible.

Encore une fois, on pourrait argumenter "Hé, créez juste les énumérations pour les noms et oubliez les décalages". Mais les raisons possibles de ne pas créer de noms d'énumération ont déjà été discutées ci-dessus.

17
user7605325

L'ensemble des fuseaux horaires dans le JDK peut être complètement remplacé . En tant que tel, il n'est pas possible de définir un enum pour les zones.

De plus, les identificateurs de fuseau horaire sont relativement instables. Ils sont renommés, fusionnés et généralement modifiés. (Diverses personnes, dont moi, ont essayé d'obtenir plus de stabilité dans la base de données IANA, mais le responsable de la base de données n'est pas d'accord.)

Une requête pull pour créer une classe ZoneIds dans ThreeTen-Extra fournissant des constantes serait considérée.

7
JodaStephen

Si vous voyez la description de la méthode ZoneId # getAvailableZoneIds , alors vous savez pourquoi?

Cet ensemble comprend la forme de chaîne de tous les ID basés sur la région disponibles. Les ID de zone basés sur le décalage ne sont pas non inclus dans l'ensemble renvoyé. L'ID peut être passé à of(String) pour créer un ZoneId.

L'ensemble d'ID de zone peut augmenter au fil du temps, bien que dans une application typique, l'ensemble d'ID soit fixe. Chaque appel à cette méthode est thread-safe.

5
holi-java