Getter, setter và constructor
Nội dung bài · 5 mục
- 1.Khái niệm
- 2.Ví dụ
- 3.Thử ngay
- 4.Lỗi hay gặp
- 5.Tóm tắt
Ở bài trước, tạo một sản phẩm tốn ba dòng: new, gán tên, gán giá. Quên một
dòng là có sản phẩm không tên. Bài này dùng constructor để bắt buộc truyền đủ
dữ liệu lúc tạo, và getter, setter để quyết định phần nào được sửa về sau.
Khái niệm
🔒 private: từ khoá cho biết field hoặc method chỉ dùng được bên trong class khai báo nó.
🔐 Getter và setter: method public dùng để đọc (getX) và ghi (setX) một field private từ bên ngoài class.
🏗️ Constructor: method đặc biệt trùng tên class, tự chạy khi gọi new, dùng để gán giá trị ban đầu.
Ví dụ
// Main.java
void main() {
var pen = new Product("Bút bi", 5000);
pen.setStock(120);
System.out.println(pen.getName() + ": "
+ pen.getPrice() + "đ");
System.out.println(pen.getStock());
}
// Product.java
class Product {
private String name;
private long price;
private int stock;
public Product(String name, long price) {
this.name = name;
this.price = price;
}
public String getName() { return name; }
public long getPrice() { return price; }
public int getStock() { return stock; }
public void setStock(int stock) {
this.stock = stock;
}
}- Có cả getter và setter: đọc và ghi được từ bên ngoài, như
stock. - Chỉ có getter: bên ngoài chỉ đọc được. Chỉ code bên trong class gán được
namevàprice, ở đây là constructor. - Constructor không có kiểu trả về, tên trùng với tên class.
this.namelà field của object,namelà tham số.- Class có constructor nhận tham số thì
new Product()không còn dùng được. Muốn tạo sản phẩm thì phải truyền đủ tên và giá.
Thử ngay
Trong Product.java, thêm dòng
System.out.println("Tạo sản phẩm: " + name); vào đầu constructor. Rồi
thay nội dung Main.java bằng đoạn dưới và chạy java Main.java:
// Main.java
void main() {
System.out.println("Bắt đầu");
var pen = new Product("Bút bi", 5000);
var book = new Product("Vở", 12000);
System.out.println("Kết thúc");
}Đoán trước khi chạy: dòng "Tạo sản phẩm" in ra mấy lần, và nằm ở đâu?
Xem kết quả
Bắt đầu
Tạo sản phẩm: Bút bi
Tạo sản phẩm: Vở
Kết thúcHai lần, mỗi lần gọi new in một lần. Constructor chạy đúng lúc object được tạo.
Lỗi hay gặp
Truy cập thẳng field private. Compiler chặn ngay.
// SAI — lỗi compile: price là private
var pen = new Product("Bút bi", 5000);
pen.price = 4000;// ĐÚNG — truyền giá đúng ngay lúc tạo
var pen = new Product("Bút bi", 4000);Muốn cho sửa giá thì phải viết thêm setPrice. Không có setter nghĩa là giá
đã chốt từ lúc tạo.
Quên this. Tên tham số trùng tên field, thiếu this. thì Java gán tham
số cho chính nó.
// SAI — gán price cho price, field price vẫn là 0
// Item.java
class Item {
private long price;
public Item(long price) {
price = price;
}
}// ĐÚNG — vế trái là field this.price
// Item.java
class Item {
private long price;
public Item(long price) {
this.price = price;
}
}Tóm tắt
- Field để
private, bên ngoài đọc qua getter, ghi qua setter. - Không viết setter thì field chỉ đọc được từ bên ngoài.
- Constructor trùng tên class, chạy khi
new, gán giá trị ban đầu. - Trong constructor, vế trái là field (
this.price), vế phải là tham số (price).
Tự kiểm tra
0/3 câuClass Customer có field private String email, có getEmail() nhưng không có setEmail. Dòng customer.setEmail("moi@shop.vn"); thì sao?
Class Order chỉ có constructor Order(int id). Dòng var o = new Order(); thì sao?
Field nào nên có setter?