考虑以下代码(java 8):
try
{
// try to create an instance of CardExpirationDate
AfCardExpirationDate.getInstance( anExpMonth, anExpYear);
return true; // expiration date is valid
}
catch ( IllegalArgumentException e )
{
// invalid expiration date
return false;
}
从未使用过调用AfCardExpirationDate.getInstance
的结果。我们仅在是否抛出IllegalArgumentException
的情况下在此处检查。
这样安全吗?还是可以在编译时或运行时代码优化器中取消此类调用?
答案 0 :(得分:2)
编译器无法对此进行优化。简单明了。
编译器无法知道对getInstance()
的无意义调用是否没有副作用。除此之外,编译器显然确实注意到您的方法具有两个返回路径,因此try / catch很重要。
除此之外,作为Java程序员,您不必关心在Java源代码和类文件字节码之间进行的优化步骤。
JIT在运行时具有概要信息,当发现该方法被频繁调用以至于值得进行优化时,它将在运行时将其编译为机器代码。做具有上下文概要文件知识的编译器可能会做的所有事情。
最后:您误将try / catch用于验证。那简直是不好的做法(例如,由于相关的运行时性能成本)。如果您真的对A)代码质量和B)运行时性能非常重视,那么只需进行完整的验证即可,而不必依赖某些代码。