当前位置: 首页 > 面试题库 >

封装和吸气剂

寇开畅
2023-03-14
问题内容

我在读这篇文章,了解为什么gettersetters邪恶。本文没有说过 不要
使用它们,而是告诉您以限制使用这些方法的方式进行思考,或者引用该文章:

不要要求您进行工作所需的信息;询问具有信息的对象为您完成工作。

当您需要在GUI中显示数据但没有getter方法时会发生什么?本文简要介绍了这一点,但并不完整。它提到将JComponent传递给类,但是如果您要进行GUI更改,则可能需要进行很多工作才能修复。

例如,您有一个Book类(限制此示例以使其易于阅读)。

public final class Book {

    private String title;
    //Authors is class with the attributes authorFirstname, authorLastname
    private List<Author> listofAuthors;


    public Book(String title, List<Author> listofAuthors)
    {
        //initialization
    }

    //other methods that do work
}

如果我有一个GUI,该GUI
JTextField可以显示书名和一个JTable显示作者列表,那么我将如何编写方法为我“完成工作”并显示结果?这getter是需要a的那些时间之一吗?


问题答案:

Allen Holub的文章(您提到的那篇文章)是完全正确的,至少在进行面向对象时,您不应该索要数据。不,显示事物不是打开对象的有效借口。

如果您有个Book,则要求Book使其显示!它不应该不管是否使用一个JTextFieldJTable或什么的。当然,根据您的要求,您可以执行以下操作:

public final class Book {
    ...
    JComponent display() {
        ...
    }
}

当然,面向对象的要点是您要尝试本地化更改(尽可能限制为一类)。唯一的方法是将依赖于相同事物的功能本地化(最好是)相同的类。也称为增加“内聚力”。

因此,现在,如果Book内部结构发生变化,则所有内容(包括如何Book显示)都在其Book本身内,因此无需“搜寻”使用的代码Book

现在,答案是“干净”的,因为您正在将演示代码与“业务逻辑”混合在一起。可能有趣的是,不将演示文稿与“业务逻辑”混合在一起的整个想法来自早期,那时我们仍然认为演示文稿可能是“远程”到“业务对象”的,而“业务对象”可能是由多个应用程序用于不同的事物。就是
多层设计。YAGNI。大多数时候,没有真正的理由在单个应用程序中具有人为的技术界限。只要Book知道它是GUI应用程序的一部分,就不会造成任何危害,并且拥有真正的好处(可维护性)。

编辑:这是`display()方法的详细显示方式,其中显示了标题和作者(Swing的伪代码):

public final class Book {
    private final String title;
    private final List<Author> authors;
    ...
    public JComponent display() {
        JPanel bookPanel = new JPanel();
        bookPanel.add(new JLabel(title));
        JList authorsList = new JList(); // Or similar
        for (Author author: authors) {
            authorsList.add(author.display());
        }
        bookPanel.add(authorsList);
        return bookPanel;
    }
}

然后,您可以add()将该组件简单地放置到想要在其中显示书的任何回转容器中。



 类似资料:
  • 问题内容: 有人可以帮助我迅速了解正确使用吸气剂和吸气剂的方法。我对它的印象与说Java不一样。 这是Swift中用于存储和访问类变量的正确用法吗? 问题答案: 斯威夫特提供了更结构化的方法来和比Java。 你可以,但你应该 不会 ,写getter和setter方法就像你在你的代码一样。 相反,(如果您使用)只需声明可见性为non的属性即可(例如,在我的示例中)。这样,您班级外的呼叫者将可以查看属

  • 我有一个现有的工作项目与gulp工作流。一切都很顺利。我的gulp用了这个: null null 我是否可以在不使用的情况下对其进行包装,以避免出现该问题?

  • 问题内容: 当getter返回一个属性(例如返回其他相关对象的a)时,该列表及其对象是否应该是不可变的,以防止类外部的代码更改这些对象的状态而又不知道主要的父对象? 例如,如果一个对象,具有吸气剂,它返回一个的目的,那么任何码调用该吸气剂: 可以在对象不知道的情况下从该列表中删除对象。 可以在对象不知道的情况下更改每个对象。 那么我们应该在这里做什么?我们应该只相信调用代码并返回容易可变的对象,还

  • 问题内容: 我只是试图将基于Maven的项目发送到另一台计算机和恐怖,到处都是红色标记! 但是,建造就好了。 很快,我注意到Lombok并没有为我的类生成getter和setter,尽管Eclipse已正确识别了and 。 两台计算机使用相同的Maven版本(3.0.4),但使用不同的JDK(1.6_23和1.6_33)。他们都使用Eclipse Indigo 32位。您是否有解决问题的想法? 问

  • 问题内容: 我知道Java中关于布尔型getter的约定包括前缀“ is”。 但是,如果主题是复数呢?也就是说,如果我不想知道某个商店是否已营业,而又想知道所有商店是否已营业怎么办? 用英语没有意义。 我很想写这样的getter: 我认为这是有意义的,但我一直在别人告诉我,我应该只是吮吸它,抛弃主题动词协议和使用,,。 无论如何,对于在复数主题上运算的布尔型吸气剂,我该怎么办? 问题答案: 我不记

  • 问题内容: 如果在这样的调用中收到NullPointerException: 我得到了一个无用的异常文本,例如: 我发现很难找出哪个调用实际上返回了null,经常发现自己将代码重构为如下形式: 然后等待更具描述性的NullPointerException,该异常告诉我要查找的行。 你们中的某些人可能会认为,连接吸气剂是不好的风格,无论如何都应避免,但是我的问题是:我可以在不更改代码的情况下找到错误