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

WebP là gì? Hướng dẫn cách để chuyển hình ảnh jpg, png qua webp

WebP là gì? WebP là một định dạng ảnh hiện đại, được phát triển bởi Google

Điểm khác biệt giữa IPv4 và IPv6 là gì?

IPv4 và IPv6 là hai phiên bản của hệ thống địa chỉ Giao thức Internet (IP). IP l

Check nameservers của tên miền xem website trỏ đúng chưa

Tìm hiểu cách check nameservers của tên miền để xác định tên miền đó đang dùn

Mình đang dùng Google Domains để check tên miền hàng ngày

Từ khi thông báo dịch vụ Google Domains bỏ mác Beta, mình mới để ý và bắt đầ