Fine-grain refactoring deep dive (4) – Enum.

1. Issue Cho đoạn code sau: public enum DataActionEnum { CREATE(0, "create"), UPDATE(1, "update"), DELETE(2, "delete"); private Integer id; private String name; DataActionEnum(Integer id, String name) { this.id = id; this.name = name; } public Integer getId() {return id;} public void setId(Integer id) {this.id = id;} public String getName() {return name;} public void setName(String name)

1. Issue

Cho đoạn code sau:

public enum DataActionEnum {

	CREATE(0, "create"),
	UPDATE(1, "update"),
	DELETE(2, "delete");

	private Integer id;

	private String name;

	DataActionEnum(Integer id, String name) {
		this.id = id;
		this.name = name;
	}

	public Integer getId() {return id;}

	public void setId(Integer id) {this.id = id;}

	public String getName() {return name;}

	public void setName(String name) {this.name = name;}
}

Thoạt nhìn thì trông có vẻ ổn, nhưng vấn đề ở đây là cách thiết kế này đã làm sai lệch mục đích ban đầu của Enum. Mà khoan đã, Enum là cái gì?

Enum (Enumeration) là 1 dạng class (bạn xem mã bytecode thì sẽ rõ) với tập hợp số lượng nhất định các hằng số (CONSTANT)

Có nghĩa rằng giá trị của Enum sau khi được khởi tạo thì không được phép thay đổi tại runtime.

Solution

Chúng ta sẽ viết lại đoạn code phía trên một cách đơn giản và xịn xò hơn với sự giúp sức của thư viện lombok như sau:

@Getter
@RequiredArgsConstructor
public enum DataActionEnum {

	CREATE(0, "create"),
	UPDATE(1, "update"),
	DELETE(2, "delete");

	private final Integer id;
	private final String name;
}

Enum field không phải là constant vì điều kiện để khai báo một constant trong Java phải đi kèm với keywords static final, tuy nhiên khi khai báo static thì phải initialize giá trị cho nó là điều mà chúng ta sẽ không làm ở đây. Thế nên ở đoạn code phía trên, chúng ta cố gắng tạo nên fake constant bằng việc loại bỏ setter/mutator ra khỏi enum và thêm từ khóa final vào tất cả các field.

Nguồn: viblo.asia

Bài viết liên quan

Thay đổi Package Name của Android Studio dể dàng với plugin APR

Nếu bạn đang gặp khó khăn hoặc bế tắc trong việc thay đổi package name trong And

Lỗi không Update Meta_Value Khi thay thế hình ảnh cũ bằng hình ảnh mới trong WordPress

Mã dưới đây hoạt động tốt có 1 lỗi không update được postmeta ” meta_key=

Bài 1 – React Native DevOps các khái niệm và các cài đặt căn bản

Hướng dẫn setup jenkins agent để bắt đầu build mobile bằng jenkins cho devloper an t

Chuyển đổi từ monolith sang microservices qua ví dụ

1. Why microservices? Microservices là kiến trúc hệ thống phần mềm hướng dịch vụ,