编译时安全和运行时安全是什么意思?

时间:2018-12-08 05:44:42

标签: java runtime compile-time


根据this post about Java Enum,可以通过使用==运算符比较状态并防止NullPointerException来实现运行时安全。

if(testPz.getStatus() == Pizza.PizzaStatus.DELIVERED); 

对于compile-time-safety,尽管从逻辑上讲,该比较被证明是错误的,但通过使用==运算符可以避免此问题。

if(testPz.getStatus() == TestColor.GREEN);

您能告诉我Java中的compile-time-safetyruntime-safety是什么吗?

如果可以的话,请给我举个例子。

1 个答案:

答案 0 :(得分:1)

通常,编译时安全意味着您的代码遵循语言规则,而运行时安全意味着您的代码做正确的事情。不同的语言提供不同的规则集,因此有不同的安全保证。

编译时安全性意味着编译器可以分析您的代码并保证不存在某些类型的错误。在Java中,一个常见的例子是类型安全(保证类型List的变量中的对象是某种列表实现)。某些语言(例如JVM上的Kotlin)还可以保证不会发生空指针异常,因为已标识了可空变量和非空变量,并且需要显式检查。

但是,编译时安全有其局限性。例如,您可以使用Java中的 cast 专门告诉编译器“即使您无法证明它,我也知道这里的对象属于某种类型”,如果错误的话,您在运行程序时会得到ClassCastException

您链接到的文章正在谈论我的第二个示例,空安全性。在Java中,引用类型的变量可以具有值null,该值实际上并不指向实际实例,并且如果您尝试对该变量调用方法,则会得到一个NullPointerException 。在此示例中,如果您有一个枚举Status,则调用statusVariable.equals(VALUE)时,如果statusVariable为null,则将获得异常:该表达式在编译时安全,但是不是运行时安全的,因为Java不能保证空值。相反,==可以安全地与null值一起使用,因此即使您的变量为null,您也将获得false的结果而不是异常。