java - 返回数据结构以显示信息

标签 java oop encapsulation

我正在阅读this answer关于 SESE 关于封装和 getter/setter 的信息。假设我喜欢使用不可变类,因此如果实现了 setter,它将返回反射(reflect)更改的新对象,例如:

//return a new Book reflecting the price change.
public Book updatePrice(double price){}

在链接中,答案建议我有一个名为 getDisplayinformation() 的方法返回一个数据结构。

(think an array indexed by an enum, a struct, or a methodless class)

按照此建议,我将如何退回带有作者列表的书籍?

public final class Author{
    private final String id;
    private final String firstname;
    private final String lastname;
    //Constructor 
}
public final class Book{
    private String bookID;
    private final String title;
    private List<Author> authorsList;
    private double price;
    //Constructor
}

假设我想返回 Map<String,String>

public Map<String,String> getDisplayinformation(){

    Map<String,String> displayMap = new HashMap<String,String>();
    display.put("BookTitle", title);
    display.put("ID", bookID); 
    display.put("Price", price.toString())
    //insert authorsList;
    return displayMap;
}

最佳答案

你引用的答案只对了一半。为字段提供 getter 确实会破坏封装,因为它使调用者依赖于某些内部结构。

现在,返回一个映射,其中调用者需要知道键并知道该信息是什么,基本上与为该字段提供 getter 没有什么不同。

面向对象试图告诉我们功能需要与数据捆绑在一起。因此,Book 必须有某种方法来呈现Book。我不会将其称为 getDisplayInformation(),而是简单地称为 display()。它可以返回一些东西,也可以接受相关参数。

重点是,display() 返回的任何内容都必须与演示文稿相关,而不能与书籍相关。此时,关于作为一本书的语义应该丢失,否则调用者将紧密耦合。

因此,可以返回 XML 文档、JSON 文档、HTML、Wicket Component,无论您可以使用什么来进行独立于 Book 的演示.

或者,该方法可以采用一个参数来呈现自己。就像 AWT Component.paint(Graphics g) 或其他东西。

注意:这实际上是一个有争议的话题。混合范式开发(过程式和OOD的混合)认为表示需要与对象分离,而面向对象则认为数据和功能总是在一起。

关于java - 返回数据结构以显示信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46634952/

相关文章:

java - 合并多个图像使android非常慢

java - 使流平行于 flatMap 的结果

java - 在 netbeans 中调整 jdialogbox 的大小

java - 在 @KafkaListener 注释方法中使用响应式(Reactive) webflux 代码

java - 使用 Java 中的命令模式进行保存/加载

python-3.x - 带或不带对象继承的 tkinter GUI

php - PHP 中的聚合和委托(delegate)是什么?

oop - 如何使用包含 where 的抽象多方法?

C#:封装例如集合

C# 同时声明类和接口(interface)