java - 信息隐藏。什么时候是安全,什么时候是软件加权?

标签 java information-hiding

我正在实现一个 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 更改为仅接受非空,而不会破坏任何人的代码
  • 如果您决定分发字符串 trimmed,您只需更改 getter
  • 例如,如果我们讨论的不是不可变的字符串,而是可变的列表,您可以分发列表的防御性副本,这样就没有人可以更改您的列表了
  • 如果您不希望任何人更改您的字符串,只需删除 setter 即可

等等。等等。这种策略使您能够授予/限制对您的字段的访问。它使您能够在将来更改您的类(class),而无需破坏类(class)用户的代码。这是声明字段访问器/修改器的默认方式。

封装、抽象、信息隐藏等还有更多。字段抽象之后最重要的主题肯定是接口(interface)。请随意阅读有关主题的内容。

关于java - 信息隐藏。什么时候是安全,什么时候是软件加权?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18672404/

相关文章:

java - 无法关闭我的 session Servlet

java - 在 Android 中解决缩短的 url

language-agnostic - 通过信息隐藏进行有效封装的绝妙例子?

c - 从模块的外部上下文中正确隐藏函数

java - Spring 无法找到 JpaRepository

java - 如何使用动态batch_size(即batch_size未知)的JpaRepository进行批量插入

java - 有效的多边形碰撞检测

java - 降低静态方法的可见性

image - 如何在 jpg 或 gif 照片中隐藏信息?

c++ - 是否可以隐藏在 C++ 代码中定义的密码