我正在阅读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/