类型安全和值安全之间的区别

4
我一直在读《Head First面向对象分析与设计》这本书,试图学习面向对象编程。
在这本书的某一页上,我读到了以下内容:
“我们在过程中使应用程序变得不那么脆弱。现在它不容易出错了,因为我们通过这些枚举类型增加了类型安全性和值安全性。”
还有:
“所以你不能拼写错误或者错误地输入一个枚举值而不会得到编译器错误。这是一种既能获得类型安全性又能获得值安全性的好方法;对于具有标准范围或合法值集的任何内容,你可以避免获取错误数据。”
我读了this answer,感到困惑,因为我认为答案是我们可以将其视为值安全。
现在我的问题是类型安全和值安全之间有什么区别? 枚举如何带给我们类型安全和值安全?请给我一些关于枚举中类型安全和值安全场景的例子。

谢谢。
对不起我的英语不好。

2个回答

6

假设我们正在举办一个超级英雄大会。在他们注册时,我们会问他们是否属于漫威或DC。

类型安全只是检查用户被允许输入的值的种类。就像这样的一个方法:

void register(String name, String affiliation);

用户只能输入字符串,不能输入整数、列表或文件。

但是,用户仍然可以输入任何字符串,可能是有效的动作漫画组,也可能不是我们希望注册的组。像'abcd'、'dummy'、'action_labs'这样的值仍然是有效的字符串,但我们不希望Action Labs的伙伴注册。类型安全:true,值安全:false。此外,Marvel或DC超级英雄不知道是否应该输入'marvel'或'Marvel',或者无意中输入'malver'或'marvl'等等。即使使用equalsIgnoreCase(),要找到和Marvel有多少个超级英雄也很困难。

通过值安全性,我们定义了一个枚举:

enum ComicGroup{
    MARVEL, DC
}

修改方法:
void register(String name, ComicGroup affiliation);

用户现在只有两个选项ComicGroup.MARVELComicGroup.DC。我们可以百分之百确定我们的值将始终是这些选项之一。类型安全:真,值安全:真。

3
据我理解,类型安全是指当你无法将错误类型的值赋给变量时,例如:
Integer a = "text";

你不能这样做,因为你不能(编译错误)将一个字符串赋值给一个整数变量。为了防止这种类型的问题,Java已经是类型安全的。
例如,JavaScript就不是类型安全的,因为你不需要为变量指定类型。
var a = "text"

a的类型变为字符串,因为您将其分配了一个文本值。

进一步讨论这种类型安全的答案

值安全

在类型安全语言中,当您对值进行赋值时会进行检查。在这种情况下,使用枚举确保管理变量的可能值是有效的。如果您使用枚举并指定可能的值为[1,2,3],那么您无法将4或"4"赋值给它,以防止破坏您的代码或变量的类型。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接