术语“信息隐藏”不是很常用。就个人而言,我从未听说过它,而且我是计算机科学专业的。这就是为什么我们大多数人都如此困惑,而你可能误解了它的原因。
当使用类似于“信息隐藏”的术语时,它实际上是在安全上下文中使用的。隐藏在安全中的信息通常意味着某种形式的隐蔽性安全——这意味着它试图通过某种加密和/或混淆将管理员登录凭据隐藏在应用程序中。然而,这总是一件坏事,因为它永远不会奏效。
事实证明,“信息隐藏”的真正含义实际上是封装(或非常接近)。现在,这是我们都理解的术语。还有更多与相同问题组合相关的术语,即抽象和实现隐藏。有许多不同的定义,所有的词都有些重叠,甚至有人认为它们是一样的。
一个是肯定的。信息隐藏、封装、抽象或实现隐藏与应用程序安全没有任何关系。它们都与应用程序设计有关,可帮助您实现设计良好、稳定、可扩展且无错误的应用程序。
您的示例不会以任何方式增加应用程序的安全性(将字节码反编译为源代码非常容易),也没有使用封装。
这是封装:
public class MyClass {
private String someText;
public String getSomeText() {
return someText;
}
public void setSomeText(String someText) {
this.someText = someText;
}
}
私有字段someText被封装了,因为它不能直接访问。它必须通过 getter/setter 访问。对字段的直接访问被抽象掉了。现在,虽然这似乎是一项不必要的工作,但它在很多方面都有帮助:
- 如果将来您决定字符串只应为非空值,则可以将设置器更改为仅接受非空值而不破坏任何人的代码
- 如果您决定分发字符串
trimmed,您可以简单地更改 getter
- 例如,如果我们不是在谈论不可变字符串,而是在谈论可变字符串,
List您可以分发列表的防御性副本,这样任何人都无法更改您的列表
- 如果您不希望任何人更改您的字符串,您可以简单地删除设置器
等等。这种策略使您能够授予/限制对您的字段的访问权限。它使您能够在将来更改您的班级而不会破坏班级用户的代码。这是向字段声明访问器/修改器的默认方式。
封装、抽象、信息隐藏等还有很多。字段抽象之后最重要的主题肯定是接口。随意阅读主题。