我习惯用Python开发,但出于工作原因必须用Java来实现.我正面临着一个在Python中无足轻重的任务,我想了解如何以正确的方式在Java中处理这个问题.
我需要解析持续时间字符串.它可以是毫秒(235毫秒)或秒(32秒).它也可以是"<1ms"作为特例.
解析在代码中至少发生三次,所以我想把它分成一个方法.但是我的代码确实需要知道,不仅仅是以ms为单位的结果值,还有它是ms还是s以及是否<1ms(0是不同的值).
在Python中,我只返回一个元组:
return (value_in_milliseconds,is_in_seconds,is_under_1ms)
Run Code Online (Sandbox Code Playgroud)
在CI中将定义这三个值的结构并返回它.在Pascal我定义了一条记录.
在Java中,我无法返回元组,我无法定义记录,所以我该怎么办?
我唯一能想到的是创建一个表示持续时间值的类.构造函数将获取字符串并解析它.该类将具有字段:int milliseconds,boolean inSeconds,boolean小于1ms.
但这听起来非常重量级 - 有更好的解决方案吗?
Eri*_*ikE 23
不要传递一组必须在它们之间保持一致的标志以形成合理的状态.如果is_in_seconds和is_under_1ms两者都是true?为什么包含该单词的变量会milliseconds被解释为秒?代码中的错误外观.如果你可以对它做任何事情,错误的代码就不好 - 我们应该编写正确/错误的外观与现实相匹配的代码 - 应用于代码的最小惊讶原则,甚至可能是随后的成功之坑那些大脑会爆炸的开发者.
这听起来像是一些原始的痴迷代码气味/反模式,也许来自你的Python背景?(我对Python几乎一无所知,所以请随意忽略这个猜测.)
解决方案:创建一个真实的域级对象,表示大致持续时间的想法.
一种可能的实现方式:
创建一个DurationScale有成员枚举Second,Millisecond,SubMillisecond.
创建一个类ApproximateDuration,它接受duration整数和durationScale枚举值.
现在在您的其他代码中使用此对象.如果您需要对一系列这些持续时间求和,请创建一个知道如何解释每个持续时间并将它们添加到一起的类.或者为这个类添加方法.
一些概念的另一种像DurationScale可能是MarginOfError它可以在几毫秒内一些任意数量的,本身来表达.这可以允许您使用严格的数学公式来适当地增加误差范围,因为您将不同的ApproximateDuration对象一起合并为一个新ApproximateDuration对象.
注意:您可以看到有关我推荐此方法的原因的进一步讨论.
您确定的实现也是处理它的好方法,您可以在其中明确说明下限和上限:
public final class ApproximateDuration {
private final int lowMilliseconds;
private final int highMilliseconds;
public ApproximateDuration(int lowMilliseconds, int highMilliseconds) {
this.lowMilliseconds = lowMilliseconds;
this.highMilliseconds = highMilliseconds;
}
public int getLowMilliseconds() {
return lowMilliseconds;
}
public int getHighMilliseconds() {
return highMilliseconds;
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,将单词Milliseconds放在变量和属性名称中很重要,这个类的不变性也是如此.
jiv*_*key 20
它与C结构没有什么不同,但你最终会以某种方式继承 Object
class Blah {
public String value_in_milliseconds;
public String is_in_seconds;
public String is_under_1ms;
}
Run Code Online (Sandbox Code Playgroud)
mas*_*ter 14
定义自己的类或使用例如apache commons:
return Triple.of(value_in_milliseconds, is_in_seconds, is_under_1ms);
Run Code Online (Sandbox Code Playgroud)
我试着用下面的例子来传递一个代码Object[],保持简单:
public class MultiWayTest
{
public static Object[] send() {
return new Object[] { 1002322, false, true };
}
public static void main(String[] arg) {
Object[] recieve=send();
}
}
Run Code Online (Sandbox Code Playgroud)
你可能已经注意到了这个陈述 return new Object[] { 1002322, false, true };
希望有所帮助
就个人而言,我会这样做:
class Duration {
final int millis;
final boolean specifiedInSeconds;
final boolean under1ms;
Duration(String s) {
// parsing logic
}
}
Run Code Online (Sandbox Code Playgroud)
这个解决方案相当短,允许编译器检测字段名称中的拼写错误,封装可能不会设置布尔值的不变量,并且可以安全地与其他代码共享,而不会有别名错误的风险.
| 归档时间: |
|
| 查看次数: |
6923 次 |
| 最近记录: |