0

我正在实现一个 Java 应用程序,我想知道哪个是良好的安全性(信息隐藏)和软件可读性之间的平衡。例如,我定义了一个公共构造函数的许多方法,它内部只有一个对象实例的方法

public class myFrame extends JFrame
{
    /**
     *Constructor
     */
    public myFrame()
    {
        initialize();
    }

    private void initialize () 
    {
       //something that instance a myFrame object
    }

这样,调用 myFrame 构造函数的外部类无法知道myFrame 如何实例化它的对象,而只能接收想要的对象。这个想法可以应用于任何 myFrame 方法,但我发现它对软件的可读性不是很好,有让它变得闷热的风险。

那么,在您看来,哪个是好方法?将信息隐藏应用于任何方法或仅用于重要的方法?你会怎么做?

我感谢您,知道您的开发人员经验会激发我的思维!

4

2 回答 2

3

术语“信息隐藏”不是很常用。就个人而言,我从未听说过它,而且我是计算机科学专业的。这就是为什么我们大多数人都如此困惑,而你可能误解了它的原因。

当使用类似于“信息隐藏”的术语时,它实际上是在安全上下文中使用的。隐藏在安全中的信息通常意味着某种形式的隐蔽性安全——这意味着它试图通过某种加密和/或混淆将管理员登录凭据隐藏在应用程序中。然而,这总是一件坏事,因为它永远不会奏效。

事实证明,“信息隐藏”的真正含义实际上是封装(或非常接近)。现在,这是我们都理解的术语。还有更多与相同问题组合相关的术语,即抽象实现隐藏。有许多不同的定义,所有的词都有些重叠,甚至有人认为它们是一样的。

一个是肯定的。信息隐藏、封装、抽象或实现隐藏与应用程序安全没有任何关系。它们都与应用程序设计有关,可帮助您实现设计良好、稳定、可扩展且无错误的应用程序。

您的示例不会以任何方式增加应用程序的安全性(将字节码反编译为源代码非常容易),也没有使用封装。

这是封装:

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您可以分发列表的防御性副本,这样任何人都无法更改您的列表
  • 如果您不希望任何人更改您的字符串,您可以简单地删除设置器

等等。这种策略使您能够授予/限制对您的字段的访问权限。它使您能够在将来更改您的班级而不会破坏班级用户的代码。这是向字段声明访问器/修改器的默认方式。

封装、抽象、信息隐藏等还有很多。字段抽象之后最重要的主题肯定是接口。随意阅读主题。

于 2013-09-11T20:35:44.597 回答
0

试图隐藏或构想信息不会给你带来安全感。它只能阻止最弱的攻击者,它会提供虚假的安全感,这是你能得到的最糟糕的情况。

您的类初始化示例是错误的。第一个构造函数不是继承的,因此将您的代码移动到某个私有方法不会有任何区别。其次,如果想在你的类的构造函数中使用 initialize() 方法而不在其他任何地方,请使用初始化程序 (也就是初始化块)——它们就是为此而生的。

于 2013-09-11T21:49:18.870 回答