Setter riêng tư
Thuộc phần Lập trình hướng đối tượng trong hành trình Kotlin của Coddy. Bài học 9 trên 57.
Thông thường, code bên ngoài nên đọc một thuộc tính nhưng không thay đổi nó. private set giữ getter ở phạm vi công khai và chỉ đặt setter ở phạm vi riêng tư:
class Counter {
var count = 0
private set
fun increment() {
count++
}
}Bên trong main:
val c = Counter()
c.increment()
println(c.count)
// c.count = 99 // lỗi: phương thức setter là riêng tưĐầu ra:
1Cách này phù hợp với những giá trị chỉ được thay đổi theo một quy tắc, chẳng hạn như điểm số chỉ tăng khi được cộng điểm hợp lệ:
class Player(val name: String) {
var score = 0
private set
private val _history = mutableListOf<Int>()
val history: List<Int> get() = _history
fun award(points: Int) {
if (points <= 0) return
score += points
_history.add(points)
}
}Bên trong main:
val p = Player("Ada")
p.award(10)
p.award(-5)
p.award(3)
println(p.score)
println(p.history)Đầu ra:
13
[10, 3]history ở trên cho thấy một mẫu phổ biến: một MutableList riêng tư bên trong lớp, được cung cấp dưới dạng List chỉ đọc. Các bên gọi có thể đọc các phần tử nhưng không có add hay remove để thay đổi chúng:
private val _items = mutableListOf<String>()
val items: List<String> get() = _items // chế độ xem chỉ đọc
// bên ngoài: items.add("x") // lỗi: List không có addval không bao giờ thay đổi sau khi được tạo, ngay cả bên trong lớp. var cùng với private set chỉ có thể thay đổi bên trong lớp. Hãy chọn val cho các giá trị cố định trong suốt vòng đời của đối tượng:
class Order(val id: Int) { // không bao giờ thay đổi
var status = "new"
private set // có thể thay đổi, nhưng chỉ trong Order
fun ship() { status = "shipped" }
}Thử thách
DễHoàn thiện lớp Elevator(val topFloor: Int). Có thể đọc floor và trips từ bên ngoài, nhưng chỉ có thể thay đổi chúng bên trong lớp (private set). goTo(target) di chuyển giữa tầng 0 và topFloor: nếu di chuyển hợp lệ đến một tầng khác, hàm cập nhật floor, tăng trips thêm 1 và trả về true; nếu di chuyển không hợp lệ hoặc đến cùng tầng, hàm trả về false.
Code được cung cấp đọc tầng cao nhất rồi đọc các tầng cần đến. Code in ra floor 3 sau khi di chuyển hoặc stay 3 khi không chấp nhận di chuyển, cuối cùng in ra trips: cùng với số lượt di chuyển.
Viết code của bạn trong Elevator.kt. Main.kt chứa code đầu vào/đầu ra được cung cấp và bạn không thể chỉnh sửa tệp này.
Tự làm thử
fun main() {
// Đoạn code đầu vào/đầu ra đã cho: giữ nguyên
val input = generateSequence(::readLine).toList()
val lift = Elevator(input[0].toInt())
for (line in input.drop(1)) {
val moved = lift.goTo(line.toInt())
println("${if (moved) "floor" else "stay"} ${lift.floor}")
}
println("trips: ${lift.trips}")
}
Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.
Tất cả bài học trong Lập trình hướng đối tượng
1Lớp và đối tượng
Làm việc với tệpĐịnh nghĩa lớpHàm khởi tạo chínhKhối init và kiểm tra tính hợp lệHàm khởi tạo phụÔn tập: thẻ thư viện4Kế thừa
Lớp mở và lớp conGhi đè thành viênsuper và hàm khởi tạoLớp trừu tượngÔn tập: Danh bạ nhân viên2Thuộc tính và tính đóng gói
Trình truy cập tùy chỉnhBộ sửa đổi phạm vi truy cậpSetter riêng tưlazy và lateinitÔn tập: tài khoản ngân hàng5Giao diện
Khai báo giao diệnPhương thức mặc địnhNhiều giao diệnGiao diện như kiểu dữ liệuÔn tập: Phương thức thanh toánTự luyện tập: Playground Kotlin