Dart类方法优化与新增需求问询(Book/BookCatalog类)
Dart BookCatalog类优化与实现方案
基础补充:完善Book类
由于Book类的属性为私有(下划线开头),需要添加Getter方法供外部访问,同时重写toString方便打印信息:
class Book { late String _title; late int _isbn; late double _price; bool _isAvailable; // 构造函数 Book(this._title, this._isbn, this._price, this._isAvailable); // Getter方法,暴露私有属性的只读访问 String get title => _title; int get isbn => _isbn; double get price => _price; bool get isAvailable => _isAvailable; // 重写toString,自定义书籍打印格式 @override String toString() { return "书名: $_title, ISBN: $_isbn, 价格: ${_price.toStringAsFixed(2)}, 可用: ${_isAvailable ? '是' : '否'}"; } }
BookCatalog类方法优化与实现
1. 优化addBook方法(禁止ISBN重复)
优化后代码:
void addBook(Book book) { // 检查列表中是否存在相同ISBN的书籍 bool isDuplicateIsbn = _books.any((b) => b.isbn == book.isbn); if (isDuplicateIsbn) { print("添加失败:ISBN ${book.isbn} 的书籍已存在"); return; } _books.add(book); print("书籍《${book.title}》添加成功"); }
语法解释:
- 使用
List.any()方法遍历列表,只要有一个元素满足ISBN相同的条件就返回true - 明确参数类型为
Book,避免动态类型带来的潜在问题 - 添加操作反馈,方便调试与用户感知
2. 优化printBookCatalog方法(仅打印可用书籍)
优化后代码:
void printBookCatalog() { print("===== 可用书籍列表 ====="); // 过滤出_isAvailable为true的书籍 List<Book> availableBooks = _books.where((b) => b.isAvailable).toList(); if (availableBooks.isEmpty) { print("暂无可用书籍"); return; } availableBooks.forEach((book) => print(book)); }
语法解释:
- 使用
List.where()方法过滤元素,返回符合条件的迭代器后转为List - 处理空列表场景,避免无意义的遍历
- 用
forEach()简化遍历打印逻辑
3. 修复getBook方法(按ISBN获取书籍)
修复后代码:
Book? getBookByIsbn(int isbn) { // 查找匹配ISBN的书籍,找不到则返回null return _books.firstWhere( (b) => b.isbn == isbn, orElse: () => null, ); }
语法解释:
- 重命名方法为
getBookByIsbn,语义更清晰 - 使用
List.firstWhere()查找首个匹配元素,通过orElse指定找不到时的返回值(null) - 返回类型设为
Book?(可空类型),符合Dart空安全规范,避免找不到书籍时抛出异常
4. 修复calculateAvgPrice方法(正确计算平均价格)
修复后代码:
double calculateAvgPrice() { if (_books.isEmpty) { print("无法计算:书籍列表为空"); return 0.0; } double totalPrice = 0.0; for (var book in _books) { totalPrice += book.price; } return totalPrice / _books.length; }
语法解释:
- 修正返回类型为
double(原代码错误返回Book) - 移除无用参数,初始化总价变量
totalPrice - 先判断列表是否为空,避免除以0的运行时错误
- 通过Book的Getter方法
price获取私有属性值
5. 完善deleteBook方法(可靠实现删除功能)
提供两种删除方式,满足不同场景需求:
// 方式1:按书籍实例删除(需确保实例在列表中) void deleteBook(Book book) { if (_books.contains(book)) { _books.remove(book); print("书籍《${book.title}》删除成功"); } else { print("删除失败:未找到该书籍实例"); } } // 方式2:按ISBN删除(更实用) void deleteBookByIsbn(int isbn) { Book? targetBook = getBookByIsbn(isbn); if (targetBook != null) { _books.remove(targetBook); print("ISBN ${isbn} 的书籍删除成功"); } else { print("删除失败:未找到ISBN为${isbn}的书籍"); } }
语法解释:
- 原代码的
remove(book)仅对列表中存在的实例有效,添加contains()检查避免无效操作 - 新增按ISBN删除的方法,更符合实际使用场景(用户通常知道ISBN而非持有对象实例)
- 复用之前实现的
getBookByIsbn方法,减少重复代码
Dart核心语法学习重点
- 类与对象:掌握私有成员、Getter/Setter、构造函数、toString重写的使用
- 集合操作:熟练运用List的
where/any/firstWhere/remove等常用方法 - 空安全:理解可空类型(
?)、非空断言(!)、null-aware操作符的规范使用 - 函数与方法:明确参数类型、返回值类型,避免动态类型带来的问题
内容的提问来源于stack exchange,提问作者Alexy
相关产品推荐
相关产品推荐

