Cách tạo lớp Immutable trong Java

Có một vài lớp bất biến như String, Boolean, Byte, Short, Integer, Long, Float, Double, … Hay tất cả những lớp Wrapper và lớp String là bất biến(immutable).

Để tạo 1 lớp bất biến mình áp dụng các bước sau nhé:

B1: Sử dụng 1 hàm tạo có tất cả các propertive

B2: Đánh dấu tất cả các thuộc tính, kể cả thuộc tính tham chiếu là private và final

B3: Không định nghĩa 1 `setter` nào cả

B4: Không cho phép sửa đổi hoặc truy cập trực tiếp các đối tượng.

B5: Không cho phép ghi đè phương thức (1 là định nghĩa class đấy là final, 2 là tất cả các phương thức là final, các bạn muốn làm cách nào cũng được)

Ta xét ví dụ sau:

public class Animal {
private final List<String> favoriteFoods;
public Animal(List<String> favoriteFoods) {
if(favoriteFoods == null) {
throw new RuntimeException("favoriteFoods is required");
}
this.favoriteFoods = new ArrayList<String>(favoriteFoods);
}
public List<String> getFavoriteFoods() {
// MAKES CLASS MUTABLE!
return favoriteFoods;
}
}

Trong ví trên sau bước 4 không được đảm bảo vì phương thức getFavoriteFoods() trả về biến đối tượng favoriteFoods của Animal, thằng nào mà get ra được cái này thì nó chẳng sửa đc à, nên với các biến tham chiếu này, các ông clone ra 1 đối tượng khác mà trả về nhé. Thân!

Tiếp tục xét tiếp ví dụ nữa:

public final class Animal {
private final String species;
private final int age;
private final List<String> favoriteFoods;
public Animal(String species, int age, List<String> favoriteFoods) { this.species = species;
this.age = age;
if(favoriteFoods == null) {
throw new RuntimeException("favoriteFoods is required"); }
this.favoriteFoods = new ArrayList<String>(favoriteFoods);
}
public String getSpecies() { return species;
}
public int getAge() { return age;
}
public int getFavoriteFoodsCount() { return favoriteFoods.size();
}
public String getFavoriteFood(int index) { return favoriteFoods.get(index);
}
}

Trong ví dụ trên, các bạn cmt xem đủ 5 tiêu chí chưa nhé. Thân,

Mong đợi cmt từ các bạn.


Comments

Leave a Reply

Your email address will not be published. Required fields are marked *