返回数据结构以显示信息

时间:2017-10-08 19:01:51

标签: java oop encapsulation

我在SESE上阅读有关封装和getter / setter的this answer。假设我赞成使用不可变类,所以如果实现了setter,它将返回一个反映更改的新对象,例如:

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

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

  

(想想一个由枚举,结构或无方法类索引的数组)

根据这个建议,我如何返回一本包含作者名单的书?

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;
}

1 个答案:

答案 0 :(得分:1)

你引用的答案有一半是正确的。为字段提供getter确实打破封装,因为它使调用者依赖于某些内部结构。

现在,返回一个调用者需要知道密钥并知道该信息是什么的地图,与为该字段提供getter基本没什么不同。

面向对象试图告诉我们功能需要与数据捆绑在一起。因此,Book必须有一些方法来呈现Book。我不会称之为getDisplayInformation(),而只是display()。它可以返回一些内容,也可以采用相关参数。

关键是,display()返回的任何内容都必须与演示文稿有关,而且不得与书籍有关。在这一点上,关于成为一本书的语义应该丢失,否则调用者将紧密耦合。

因此,可以返回XML文档,JSON文档,HTML,Wicket Component,无论您使用什么样的表示,都可以独立于Book

或者,该方法可以采用参数将呈现给。像AWT Component.paint(Graphics g)或其他什么。

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