目前,我正在读一本Java书,里面有很多精巧的练习。其中之一想让我用枚举来实现Mod-3的模算法。
我已经到了这样一个地步,我不知道如何以一种可以秘密地向其他人展示的方式来实现一个方法。
该方法获得一个自然数(包括。)并将其转换为模-3值,并将其作为枚举元素返回。我的问题是开关语句。正如我所做的模-3算法和检查先决条件一样,我有3种可能的情况需要检查,即0、1或2。每个都返回相应的枚举元素,但是编译器根本不知道这个,并希望我用返回语句定义一个分支。
如果在return null中定义default,我会认为它是糟糕的代码,因为知道它永远不会被执行,返回null (对我来说)毫无意义。因此,抛出一个异常会更好(我认为),但是现在我必须选择一个异常类型,我需要定义异常处理,因为逻辑使得抛出不可能(因为以前的assert)?
如果您回答,请解释为什么您的实现优于其他。我非常感谢你抽出时间来!
public enum Mod3 {
Zero(0), One(1), Two(2);
private final int value;
Mod3(final int value) {
this.value = value;
}
/**
* Converts a given natural number to a modulo value.
* @param naturalNumber To be converted to modulo-value. Not negative.
* @return The modulo-value of given naturalNumber. 0 <= value < 3.
*/
Mod3 get(final int naturalNumber) throws IllegalArgumentException {
final int moduloNumber;
if (naturalNumber >= 0)
moduloNumber = naturalNumber % 3;
else
throw new IllegalArgumentException("argument has not to be negative, but was " + naturalNumber);
assert moduloNumber >= 0 && moduloNumber < 3: "moduloNumber should have been >= 0 and < 3, but was " + moduloNumber;
switch (moduloNumber) {
case 0: return Zero;
case 1: return One;
case 2: return Two;
// I don't know what to do here.
default: throw new WhatTypeOfExceptionToUseHere("Logic error! Should have never been thrown!");
}
}
}发布于 2014-02-07 15:04:41
但是编译器对此一无所知,希望我用返回语句定义一个默认分支。
编译器抱怨是因为您的方法必须返回一些东西,遗憾的是编译器并不聪明,因为您只检查了3个选项。
可能的解决方案(所有这些解决方案都包括从default中删除switch案例):
throw new WhatTypeOfExceptionToUseHere语句之后移动switch语句。0、1或2情况改为default (我并不真正建议这样做)。return null;语句之后添加switch。对于WhatTypeOfExceptionToUseHere,可以定义新异常或使用ArithmeticException。海事组织将比前者更好。
请注意,IllegalArgumentException和ArithmeticException都是从RuntimeException扩展而来的,这意味着它们是未经检查的异常,不需要在方法定义中指定。
发布于 2014-02-07 15:06:32
它可能是一个想法,不首先断言,但使默认抛出错误。这是因为JVM可能关闭断言。
https://stackoverflow.com/questions/21630971
复制相似问题