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?
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.
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.
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.