+1

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) {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.


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí