我正在实现一个 Java 应用程序,我想知道良好的安全性(信息隐藏)和软件可读性之间的平衡点。 例如,我通过多种方式定义了一个公共(public)构造函数,该构造函数内部仅包含一个对象实例的方法
public class myFrame extends JFrame
{
/**
*Constructor
*/
public myFrame()
{
initialize();
}
private void initialize ()
{
//something that instance a myFrame object
}
通过这种方式,调用 myFrame 构造函数的外部类无法知道 myFrame 实例其对象,但仅接收所需的对象。 这个想法可以应用于任何 myFrame 方法,但我发现这对于软件的可读性来说不是很好,有让它变得乏味的风险。
那么,您认为哪种方法更好?将信息隐藏应用于所有方法还是仅针对重要方法?你会做什么?
我感谢您,因为我知道您的开发者经验将会开拓我的思维!
最佳答案
术语“信息隐藏”并不常用。就我个人而言,我从未听说过它,而且我是计算机科学专业的。这就是为什么我们大多数人如此困惑,而你可能误解了它。
当使用类似于“信息隐藏”的术语时,它实际上是在安全上下文中使用的。安全中的信息隐藏通常意味着某种形式的security by obscurity - 这意味着它例如尝试通过某种加密和/或混淆来隐藏应用程序内的管理员登录凭据。然而,这始终是一件坏事,因为它永远不起作用。
事实证明the real meaning of "information hiding"实际上是封装(或者非常接近封装)。现在,这是我们都理解的术语。还有更多术语与相同的问题组合相关,即抽象和实现隐藏。有许多不同的定义,所有单词都有些重叠,甚至有人认为它们是相同的。
不过,有一点是肯定的。信息隐藏、封装、抽象或实现隐藏与应用程序安全性没有任何关系。。它们都与应用程序设计相关,并帮助您实现设计良好、稳定、可扩展且无错误的应用程序。
您的示例不会以任何方式增加应用程序的安全性(将字节码反编译为源代码非常容易),也没有使用封装。
这是封装:
public class MyClass {
private String someText;
public String getSomeText() {
return someText;
}
public void setSomeText(String someText) {
this.someText = someText;
}
}
私有(private)字段someText
被封装,因为它不能直接访问。必须通过 getter/setter 来访问它。对该领域的直接访问被抽象掉了。现在,虽然这似乎是一项不必要的工作,但它在很多方面都有帮助:
- 如果将来您决定字符串只能为非空,则可以将 setter 更改为仅接受非空,而不会破坏任何人的代码
- 如果您决定分发字符串
trim
med,您只需更改 getter - 例如,如果我们讨论的不是不可变的字符串,而是可变的
列表
,您可以分发列表的防御性副本,这样就没有人可以更改您的列表了 - 如果您不希望任何人更改您的字符串,只需删除 setter 即可
等等。等等。这种策略使您能够授予/限制对您的字段的访问。它使您能够在将来更改您的类(class),而无需破坏类(class)用户的代码。这是声明字段访问器/修改器的默认方式。
封装、抽象、信息隐藏等还有更多。字段抽象之后最重要的主题肯定是接口(interface)。请随意阅读有关主题的内容。
关于java - 信息隐藏。什么时候是安全,什么时候是软件加权?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18672404/