为什么Duration类没有'toSeconds()'方法?

Ali*_*Ali 47 java api-design java-8

我正在查看Java 8 中的Duration类,并注意到它没有:

long toSeconds();
Run Code Online (Sandbox Code Playgroud)

但它有其他所有toXXXXX()可以获得天,小时,分钟,毫秒,纳米.我确实看到一个getSeconds()方法返回此持续时间对象中的秒数.还有一种get(TemporalUnit unit)方法可以将持续时间作为请求的时间单位.但为什么不保持toSeconds()方法的一致性?

Swe*_*per 57

让我们来看看文档说的内容:

此类以秒和纳秒为单位模拟时间量或时间量.

这基本上意味着用于存储所表示的时间量的单位是.例如,存储持续时间为5分钟和10纳秒,存储300(秒)和10(纳秒).因此,无需转换秒.你得到了秒getSeconds().

看看我的意思?所有其他方法转换相应的单位:天,分钟,小时......这就是他们开始的原因to,意思convertedTo.由于您不需要进行转换以获得持续时间(以秒为单位),因此以秒为单位返回持续时间的方法将以get.

  • 然而,这是一个有点奇怪的论点,因为封装(在类中)的*point*是隐藏实现细节.作为该类的消费者,我不需要阅读文档并发现*内部*它使用秒和纳秒,并从那里推断出我不需要toSeconds(); 并且如果在某些时候事实证明*just*nanoseconds的内部表示由于某种原因更适合,则类的所有者应该可以自由地更改内部表示而不必进行任何外部可见的更改. (32认同)
  • @MichaelKjörling我同意你的观点,应该在Duration类中包含一个toSeconds()方法(在阅读你的解释之后).虽然在阅读了Duration类的文档之后,我明白我可以使用getSeconds()代替toSecond(),但这并不直观.我去了一个切线,以确定为什么没有toSeconds()方法.我有一种感觉,一旦忘记了我在文档中看到的内容,我将重新阅读这篇文章.我很高兴其他人已经给出了这种不一致并创造了一个解决方案. (2认同)

JB *_*zet 40

这是一个已知问题,其修复程序安排在Java 9中:https://bugs.openjdk.java.net/browse/JDK-8142936

Java 9中添加的新方法toSeconds.请参阅源代码.

/**
 * 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;
}
Run Code Online (Sandbox Code Playgroud)

  • @Sweeper结束了错误报告说:*此外,用户发现缺少`toSeconds()`方法令人困惑.该方法存在,但命名为`getSeconds()`,而所有类似的方法都命名为`toXxx`.这里添加一个方便的方法可以使API更有用.* (11认同)
  • 我认为这是最好的答案.认识到你不需要它并不意味着你不应该提供它.程序员有时过于一致("不需要转换,所以为什么要给它一个假装我们转换的愚蠢名字?")忘记用户的视角,他们不关心"幕后"的内容.喜欢这个被认可和解决的事实. (9认同)
  • 这是一个问题,因为API不一致,因为错误报告说:程序员寻找一个toSeconds方法,因为所有其他方法都命名为toXxx(). (8认同)
  • 我是否误解了OP的问题?我以为OP问为什么`getSeconds`没有被称为`toSeconds`.您链接的问题似乎是关于为什么没有任何方法来获取持续时间的不同部分. (3认同)
  • 在我看来,这里发生的部分是"持续时间"暴露了它自己的实现.如果它能帮助一些人编写更高效的代码,我并不反对,但是添加`toSeconds()`函数似乎使它更接近于实际拥有抽象接口而不是一种装饰的C结构. (2认同)