2017-02-18 3 views
35

Je regardais la classe Duration en Java 8 et remarqué qu'il n'a pas:Pourquoi la classe Duration n'a pas la méthode 'toSeconds()'?

long toSeconds(); 

Mais il a tous les autres toXXXXX() pour obtenir des jours, heures, minutes, Millis, nanos. Je vois une méthode getSeconds() qui renvoie le nombre de secondes dans cet objet de durée. Il existe également une méthode get(TemporalUnit unit) pour obtenir la durée de l'unité de temps demandée. Mais pourquoi ne pas garder la méthode toSeconds() pour la cohérence?

+0

car il existe déjà une méthode privée avec ce nom:' private BigDecimal toSeconds() '?! –

+8

@CarlosHeuberger ce n'est pas une raison.Si il y avait une méthode' long toSeconds() ', BigDecimal toSeconds()' serait simplement appelé quelque chose d'autre, ou, la question suivante est pourquoi 'BigDecimal toSeconds()' est privé –

+0

@Andy mais puisqu'il y a un 'BigDecimal toSeconds()' il ne peut pas y avoir de 'long toSeconds()' –

Répondre

46

Regardons ce que le docs disent:

Ce modèle classe une quantité ou la quantité de temps en secondes et nanosecondes.

Cela signifie essentiellement que l'unité utilisée pour stocker la quantité de temps représenté est secondes. Par exemple, pour stocker la durée 5 minutes et 10 nanosecondes, 300 (secondes) et 10 (nanosecondes) sont stockées. Pour cette raison, il n'est pas nécessaire de convertir en secondes. Vous obtenir les secondes en utilisant getSeconds().

Vous voyez ce que je veux dire ici? Toutes les autres méthodes convertissent à les unités correspondantes: jours, minutes, heures ... C'est pourquoi ils commencent par to, ce qui signifie convertedTo. Puisque vous n'avez pas besoin de faire une conversion pour obtenir la durée en secondes, la méthode qui retourne la durée en secondes commence par get.

+0

Je suis d'accord avec votre explication ici @Sweeper. Puisque les secondes et les nano secondes sont déjà stockées dans des variables séparées, et que la partie nano ne peut pas être convertie en une seconde complète, les secondes peuvent être retournées telles quelles. D'autre part, les secondes peuvent être converties en nanosecondes, il existe donc une méthode toNanos pour la conversion. – Ali

+21

Il s'agit d'un argument quelque peu étrange, car le * point * de l'encapsulation (dans une classe) consiste à masquer les détails de l'implémentation. En tant que consommateur de la classe, je ne devrais pas avoir besoin de lire la documentation et de découvrir que * en interne * il utilise des secondes et des nanosecondes, et de là en déduire que je n'ai pas besoin de toSeconds(); et si, à un moment donné, il s'avère qu'une représentation interne de * seulement * nanosecondes convient mieux pour une raison quelconque, le propriétaire de la classe devrait être libre de modifier la représentation interne sans avoir à effectuer de modifications visibles à l'extérieur. –

+1

@ MichaelKjörling Je suis d'accord avec vous qu'il aurait dû y avoir une méthode toSeconds() incluse dans la classe Duration (après avoir lu votre explication). Bien que, après avoir lu la documentation de la classe Durée, j'ai compris que je pouvais utiliser getSeconds() à la place de toSecond(), ce n'était pas intuitif. Je suis parti sur une tangente pour déterminer pourquoi il n'y avait pas de méthode toSeconds(). J'ai le sentiment que je reviendrai sur ce post une fois que j'oublierai ce que j'ai lu dans la documentation. Je suis heureux que d'autres aient donné à cette incohérence et créé une solution. – Ali

31

Ceci est un problème connu dont le correctif est prévu pour Java 9: ​​https://bugs.openjdk.java.net/browse/JDK-8142936

Nouvelle méthode ajoutée en Java 9, toSeconds. Voir source code.

/** 
* Gets the number of seconds in this duration. 
* <p> 
* This returns the total number of whole seconds in the duration. 
* <p> 
* This instance is immutable and unaffected by this method call. 
* 
* @return the whole seconds part of the length of the duration, positive or negative 
*/ 
public long toSeconds() { 
    return seconds; 
} 
+3

Ai-je mal compris la question de l'OP? Je pensais que l'OP demande pourquoi 'getSeconds' n'est pas appelé' toSeconds'. semble être à propos de pourquoi il n'y a pas de méthodes pour obtenir les différentes parties de la durée. – Sweeper

+0

Je ne pense pas que ce soit un problème. Mon idée en postant la question initiale était que les toSeconds ne sont pas inclus pour la cohérence. Mais il est expliqué par @Sweeper ci-dessous que ce sont des conversions, ce qui est logique pour moi. Cela n'a aucun sens d'inclure une méthode pour convertir des secondes en secondes puisque la méthode getSeconds renvoie déjà la partie secondes. – Ali

+7

C'est un problème en ce sens que l'API n'est pas cohérente, comme l'indique le rapport de bug: les programmeurs recherchent une méthode toSeconds car toutes les autres méthodes sont nommées toXxx(). –

5

Parce que Duration

[...] modèles une quantité ou quantité de temps en secondes et nanosecondes [...]

donc il offre les deux méthodes

Il n'y a pas logique "à quelques secondes" depuis déjà est en quelques secondes.

+4

En regardant les docs java pour Duration, il y a une méthode toNanos() ainsi que getNano(). Le premier convertit la durée en nombre total de nanosecondes dans cette durée tandis que la seconde n'obtient que la partie nanométrique de la durée. – Ali

1

Citation de http://tutorials.jenkov.com/java-date-time/duration.html:

« Vous pourriez vous demander si là, vous pouvez obtenir les secondes n'est pas Il n'y a pas parce que c'est la même que la seconde partie de la durée méthode toSeconds().. partie de la durée en utilisant la méthode getSeconds() comme expliqué précédemment."