我有一个充满实用功能的课程.实例化它的实例没有语义意义,但我仍然想调用它的方法.处理这个问题的最佳方法是什么?静态课?抽象?
假设我们有一个接受枚举值的方法.在此方法检查该值是否有效之后,它将switch
覆盖可能的值.所以问题是,在验证了值范围后,处理意外值的首选方法是什么?
例如:
enum Mood { Happy, Sad }
public void PrintMood(Mood mood)
{
if (!Enum.IsDefined(typeof(Mood), mood))
{
throw new ArgumentOutOfRangeException("mood");
}
switch (mood)
{
case Happy: Console.WriteLine("I am happy"); break;
case Sad: Console.WriteLine("I am sad"); break;
default: // what should we do here?
}
Run Code Online (Sandbox Code Playgroud)
处理default
案件的首选方法是什么?
// can never happen
Debug.Fail()
(或Debug.Assert(false)
)throw new NotImplementedException()
(或任何其他例外)我以标准的方式在Java中使用断言,在我的IDE中打开它们.所以他们不是生产发布的一部分.最近我一直在看代码示例,throw new AssertionError()
我开始考虑AssertionError
应该使用的情况而不是断言.
我的猜测主要区别在于断言的可选性,因此它们不会降低生产性能,因此它们可以在代码中经常出现,但修复用户报告的难以再现的错误则更难.
因为AssertionError
,恰恰相反.
我还发现AssertionError
在执行不应该得到的代码中更实用,而不是使用assert false //We should not be here
.特别是如果需要返回值.例如:
int getFoo(AnEnum a){
if (a == AnEnum.ONE)
return bar();
else if (a == AnEnum.TWO)
return SOME_VALUE;
//else
assert false; //throw new AssertionError();
return -1; //not necessary when usin AssertionError
}
Run Code Online (Sandbox Code Playgroud)
AssertionError
- 应该提供还是仅仅是Error
(和断言类型)的事实足以或多或少地确定在发现错误的情况下将提供堆栈跟踪?我观察到java.util.Objects有一个抛出AssertionError的构造函数.
* @since 1.7
*/
public final class Objects {
private Objects() {
throw new AssertionError("No java.util.Objects instances for you!");
}
...
Run Code Online (Sandbox Code Playgroud)
这是一个静态实用程序类,因此不需要实例.
我理解的一个可能原因是,开发人员正在尝试确保不创建此类的实例.作为任何人可以调用此构造函数的唯一方法是通过反射.
有没有其他理由拥有这种构造函数?