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

What doess compile time safety and run time safety mean?


根据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 是什么吗?

如果可以,请给我一个小例子。

一般来说,编译时安全意味着你的代码遵循语言的规则,而运行时间安全意味着你的代码做正确的事。不同的语言提供不同的规则集,因此提供不同的安全保证。

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

然而,编译时安全有其局限性;例如,您可以在 Java 中使用 cast 来专门告诉编译器 "I know the object here is of a certain type, even though you can't prove it",如果您错了,您可以得到 ClassCastException 当你 运行 程序时。

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