Java 返回数据结构以显示信息

Java 返回数据结构以显示信息,java,oop,encapsulation,Java,Oop,Encapsulation,我在SESE上读到关于封装和getter/setter的文章。假设我喜欢使用不可变类,那么如果实现了setter,它将返回一个反映更改的新对象,例如: //return a new Book reflecting the price change. public Book updatePrice(double price){} 在链接中,答案表明我有一个名为getDisplayinformation()的方法,它返回一个数据结构 (考虑由枚举、结构或无方法类索引的数组) 按照这个建议,我如何归

我在SESE上读到关于封装和getter/setter的文章。假设我喜欢使用不可变类,那么如果实现了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
}
公共最终类作者{
私有最终字符串id;
私有最终字符串名;
私有最终字符串lastname;
//建造师
}
公开期末课本{
私有字符串bookID;
私人最终字符串标题;
私人名单作者名单;
私人双价;
//建造师
}
假设我想返回一个
映射

publicmap getDisplayinformation(){
Map displayMap=newhashmap();
显示.放置(“书名”,书名);
显示。放置(“ID”,bookID);
display.put(“Price”,Price.toString())
//插入作者列表;
返回显示地图;
}

你引用的答案有一半是对的。为字段提供getter会破坏封装,因为它使调用程序依赖于某些内部结构

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

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

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

因此,可以返回XML文档、JSON文档、HTML、Wicket
组件
,无论是什么,都可以用于独立于
书籍
的表示

或者,该方法可以使用一个参数来呈现自己。比如AWT
Component.paint(图形g)
之类的


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

为什么不在book类上实现toString方法?我看不出这张地图的用途。但是你可以把一个列表变成一个字符串,所以我不理解你的问题。我提供的SESE链接上的答案建议了一个数据结构,以返回我想要显示的字段,而不破坏封装。如果我想显示所有字段,我必须为每个字段提供一个getter。这不是个糟糕的设计吗?我同意@cricket_007的观点。
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;
}