You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 00:25:27