生成异常或在 if 中使用 instanceof
Generate an exception or use instanceof in an if
有时,为了避免使用 if
,我创建了抛出异常的代码来解析某些值。
例如:当您有一个输入字段,您可以在其中输入要搜索的合作伙伴编号或合作伙伴名称时,我喜欢:
try {
Integer.parseInt(string);
// use the input as int
} catch (NumberFormatException) {
// use the input as a String
}
现在我遇到了类似的问题,但是 InputStream
。
InputStream is;
try {
is = (FileInputStream) fileItem.getInputStream();
} catch (ClassCastException e) {
is = (ByteArrayInputStream) fileItem.getInputStream();
}
我的问题是:最好以这种方式抛出 exception
或带有 instanceof
的 if,例如:
InputStream is;
if (fileItem.getInputStream() instanceof FileInputStream) {
is = (FileInputStream) fileItem.getInputStream();
} else if (fileItem.getInputStream() instanceof ByteArrayInputStream) {
is = (ByteArrayInputStream) fileItem.getInputStream();
}
和为什么?
我发现了类似的问题 here or here 但没有确切的
更一般的例外规则是避免它们,如果它们也可以用更简单的结构来表达,比如 if。
生成异常的代价很高!它需要收集调用堆栈 - 并且取决于您的应用程序复杂性 - 仅此一项就可能成为堆上垃圾的可怕来源,需要由 GC 清理。
在 general 中,优先使用 RTTI(即 instanceof
)而不是异常处理。
但是在这种情况下,您的测试是完全没有必要的。因为看起来你只想要一个 InputStream
而实际上并不关心它是哪种特定类型,只需写:
InputStream is = fileItem.getInputStream();
如果您希望调用基 class 中不存在的特殊方法,您只需要专注于 InputStream
的派生子 class 之一。
有时,为了避免使用 if
,我创建了抛出异常的代码来解析某些值。
例如:当您有一个输入字段,您可以在其中输入要搜索的合作伙伴编号或合作伙伴名称时,我喜欢:
try {
Integer.parseInt(string);
// use the input as int
} catch (NumberFormatException) {
// use the input as a String
}
现在我遇到了类似的问题,但是 InputStream
。
InputStream is;
try {
is = (FileInputStream) fileItem.getInputStream();
} catch (ClassCastException e) {
is = (ByteArrayInputStream) fileItem.getInputStream();
}
我的问题是:最好以这种方式抛出 exception
或带有 instanceof
的 if,例如:
InputStream is;
if (fileItem.getInputStream() instanceof FileInputStream) {
is = (FileInputStream) fileItem.getInputStream();
} else if (fileItem.getInputStream() instanceof ByteArrayInputStream) {
is = (ByteArrayInputStream) fileItem.getInputStream();
}
和为什么?
我发现了类似的问题 here or here 但没有确切的
更一般的例外规则是避免它们,如果它们也可以用更简单的结构来表达,比如 if。
生成异常的代价很高!它需要收集调用堆栈 - 并且取决于您的应用程序复杂性 - 仅此一项就可能成为堆上垃圾的可怕来源,需要由 GC 清理。
在 general 中,优先使用 RTTI(即 instanceof
)而不是异常处理。
但是在这种情况下,您的测试是完全没有必要的。因为看起来你只想要一个 InputStream
而实际上并不关心它是哪种特定类型,只需写:
InputStream is = fileItem.getInputStream();
如果您希望调用基 class 中不存在的特殊方法,您只需要专注于 InputStream
的派生子 class 之一。