如何用B类对象设置A类字段值?类间需何种关系?Library添书实现方式?
问题2:Library类含私有Librarian对象和私有Book列表,Librarian类有私有id和public addBook方法,怎么实现Librarian给Library加书?
正确实现思路(遵循封装原则)
核心是不能让Librarian直接碰Library的私有Book列表,得通过Library提供的公开接口来操作,同时让Librarian能关联到目标Library。
方式一:Librarian持有所属Library的引用(固定归属)
让Librarian在创建时就绑定对应的Library,然后在addBook里调用Library的加书方法。这符合迪米特法则,耦合度低。
修改后代码:
import java.util.ArrayList; import java.util.List; // 先定义Book类 class Book {} public class Library { private Librarian librarian; private List<Book> books; public Library() { this.books = new ArrayList<>(); // 初始化Librarian时传入当前Library实例 this.librarian = new Librarian(this); } // Library自己提供加书的公开方法,封装内部列表 public boolean addBook(Book book) { if (book != null) { books.add(book); return true; } return false; } // 对外提供获取管理员的方法 public Librarian getLibrarian() { return librarian; } } public class Librarian { private int id; private Library library; // 持有对应的Library引用 // 构造方法传入所属Library public Librarian(Library library) { this.library = library; } public boolean addBook(Book book) { // 调用Library的方法完成加书 return library.addBook(book); } }
方式二:addBook方法传入目标Library(多Library场景)
如果Librarian需要操作多个Library,就把目标Library作为参数传给addBook方法:
class Book {} public class Library { private Librarian librarian; private List<Book> books; public Library() { this.books = new ArrayList<>(); } public boolean addBook(Book book) { if (book != null) { books.add(book); return true; } return false; } } public class Librarian { private int id; public boolean addBook(Library targetLib, Book book) { if (targetLib != null && book != null) { return targetLib.addBook(book); } return false; } }
为什么不能直接让Librarian访问books列表?
直接暴露私有列表或者用反射操作会破坏封装,以后如果Library改了书籍的存储方式(比如换成Set),Librarian的代码也得跟着改,维护成本高,不符合面向对象的设计理念。
内容的提问来源于stack exchange,提问作者Shivendra Singh
相关产品推荐
相关产品推荐

