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

Meh*_*hdi 4 java enums types type-safety

我一直在阅读《Head First 面向对象的分析与设计》书,并且正在尝试学习 oop。

\n

在本书的一页中,我读到了以下几行:

\n
\n

我们\xe2\x80\x99已经使应用程序变得不那么脆弱了。它\xe2\x80\x99现在不会那么容易被破坏,因为我们\xe2\x80\x99已经用这些枚举添加了类型安全和值安全。

\n
\n

并且:

\n
\n

因此,您可以\xe2\x80\x99 拼写或错误键入枚举而不会出现编译器错误。它\xe2\x80\x99 是一种不仅获得类型安全,而且获得价值安全的好方法;您可以避免获得任何具有标准范围或合法值集的不良数据。

\n
\n

我读过这个答案,但我很困惑,因为我认为答案是我们可以假设为价值安全的东西。

\n

现在我的问题是类型安全和值安全之间有什么区别?\nEnum 如何为我们带来类型安全值安全?请给我一些有关枚举中类型安全场景和值安全场景的示例。

\n

谢谢。\n抱歉我的英语不好。

\n

ash*_*orx 6

假设我们正在举办超级英雄大会。当他们注册时,我们会询问他们是属于 MARVEL 还是 DC。

类型安全只是检查允许用户输入什么类型的值。对于这样的方法:

void register(String name, String affiliation);
Run Code Online (Sandbox Code Playgroud)

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

但是,用户仍然可以输入任何字符串,该字符串可能是也可能不是有效的动作漫画组,或者我们不希望该组注册。“abcd”、“dummy”、“action_labs”等值仍然是有效字符串,但我们不希望 Action Labs 伙伴注册。类型安全:true,值安全:false。而且,Marvel或DC超级英雄不知道该放“marvel”还是“Marvel”,或者不小心写成“malver”或“marvl”等。即使我们用了,也很难找到有多少个sup与marvel一起equalsIgnoreCase()

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

enum ComicGroup{
    MARVEL, DC
}
Run Code Online (Sandbox Code Playgroud)

并修改方法:

void register(String name, ComicGroup affiliation);
Run Code Online (Sandbox Code Playgroud)

用户现在只有两个选择ComicGroup.MARVELComicGroup.DC。我们可以 100% 确定我们的价值观将始终是这些。类型安全:true,值安全:true。