由于 Java 是一种静态类型语言,我希望采用 int 的 abs 方法返回一个 int,如果它期望一个 float 返回一个 float,对于 Double,返回一个 Double。也许它可以总是为双打和双打等返回装箱或未装箱的类型。
所以你需要每个类型一个方法,但现在你有一个新问题:对于 byte、short、int、long,负值的范围比正值的范围大 1。
那么该方法应该返回什么
byte abs (byte in) {
// @todo
}
如果用户在 -128 上调用 abs?您总是可以返回下一个更大的类型,以保证范围适合所有可能的输入值。这将导致长期存在的问题,其中不存在正常的较大类型,并使用户在测试后总是降低值 - 可能会很麻烦。
第二个选项是抛出一个算术异常。这将防止在已知输入受限的情况下强制转换和检查返回类型,这样 X.MIN_VALUE 就不会发生。想想 MONTH,表示为 int。
byte abs (byte in) throws ArithmeticException {
if (in == Byte.MIN_VALUE) throw new ArithmeticException ("abs called on Byte.MIN_VALUE");
return (in < 0) ? (byte) -in : in;
}
“让我们忽略 MIN_VALUE 的罕见情况”的习惯不是一种选择。首先使代码工作 - 然后使其快速。如果用户需要一个更快但有问题的解决方案,他应该自己编写。
可能可行的最简单解决方案意味着:简单,但不要太简单。
由于代码不依赖于状态,因此可以并且应该将方法设为静态。这样可以进行快速测试:
public static void main (String args []) {
System.out.println (abs(new Byte ( "7")));
System.out.println (abs(new Byte ("-7")));
System.out.println (abs((byte) 7));
System.out.println (abs((byte) -7));
System.out.println (abs(new Byte ( "127")));
try
{
System.out.println (abs(new Byte ("-128")));
}
catch (ArithmeticException ae)
{
System.out.println ("Integer: " + Math.abs (new Integer ("-128")));
}
System.out.println (abs((byte) 127));
System.out.println (abs((byte) -128));
}
我捕获第一个异常并让它运行到第二个,只是为了演示。
编程中有一个坏习惯,那就是程序员更关心快速而不是正确的代码。太可惜了!
如果您想知道为什么负值比正值多一个,我有一个diagram for you。