我在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;
}
答案 0 :(得分:1)
你引用的答案有一半是正确的。为字段提供getter确实打破封装,因为它使调用者依赖于某些内部结构。
现在,返回一个调用者需要知道密钥并知道该信息是什么的地图,与为该字段提供getter基本没什么不同。
面向对象试图告诉我们功能需要与数据捆绑在一起。因此,Book
必须有一些方法来呈现Book
。我不会称之为getDisplayInformation()
,而只是display()
。它可以返回一些内容,也可以采用相关参数。
关键是,display()
返回的任何内容都必须与演示文稿有关,而且不得与书籍有关。在这一点上,关于成为一本书的语义应该丢失,否则调用者将紧密耦合。
因此,可以返回XML文档,JSON文档,HTML,Wicket Component
,无论您使用什么样的表示,都可以独立于Book
。
或者,该方法可以采用参数将呈现给。像AWT Component.paint(Graphics g)
或其他什么。
注意:这实际上是一个有争议的话题。混合范式开发(程序和ood的混合)会认为表示需要与对象分离,而面向对象则认为数据和函数总是在一起。