Enum trong Java có gì hay?

Từ phiên bản Java 5, Java cho ra đời kiểu dữ liệu đặc biệt trong Java đó chính là Enum.  Vậy Enum là gì? Nó có gì hay không trong việc sử dụng và áp dụng? Bài viết này xin tự định nghĩa và chia sẻ riêng  những lý thuyết theo cá nhân hiểu qua kinh nghiệm.



Bài viết này đọc xong thì được gì? Tôi mong muốn khi đã bỏ thời gian ra thì phải đạt được kết quả chứ không thể mung lung như một trò đùa.

  • Định nghĩa Enum là gì?
  • Vì sao Enum được ra đời?
  • Enum hay là hay cái gì?
  • Câu hỏi phỏng vấn thường gặp với enum?
enum trong java
enum trong java

1. Enum là gì?

Enum là một kiểu dữ liệu đặc biệt của Java, thường sử dụng cho việc định nghĩa một tập hợp cho các hằng số có giá trị cố định. Nhưng theo tôi đúng nhưng thiếu. “Nó định nghĩa các object cố định, nhưng giá trị của các thuộc tính chưa hẳn đã cố định và do chúng ta tùy biến sử dụng,  ở phần cuối bài các bạn sẽ thấy được vấn đề này!”.

Enum nó được xem như là một Class thông thường, vì sao? Vì nó cũng có các thuộc tính, các method và có cả Constructor.

Enum trong java là một kiểu dữ liệu đặc biệt của Java được sử dụng để định nghĩa các tập hợp các hằng số. Cụ thể hơn, Java enum là một kiểu đặc biệt của lớp trong java. Một enum có thể chứa các trường, phương thức và Constructor cho nên là một class. Nhưng các bạn lưu ý giúp mình nó khác class ở chỗ là Một class tạo ra extends từ Object, riêng với Enum nó extends từ  java.lang.Enum. Do đó enum không thể extends một class nào khác đơn giản vì java không hỗ trợ đa kế thừa.

2.Vì sao Enum được ra đời?

Bài toán đặt ra rằng chúng ta có  4 mùa trong năm là cố định. Viết phương thức kiểm tra nếu là mùa xuân thì đơn giản chỉ in ra mùa ăn chơi, còn lại chúng ta in ra mùa phải vất cả kiếm tiền!

Bài làm như sau:

class  Season.java

package com.itphutran.ex;

public class Season {
 public static final String SPRING = "SPRING";
 public static final String SUMMER = "SUMMER";
 public static final String AUTUMN = "AUTUMN";
 public static final String WINTER = "WINTER";

 public static String getJob(String season) {
 return (season.equals(Season.SPRING)) ? "Mùa ăn chơi!" : "Làm việc!";
 }
}

class Ex1.java

package ccom.itphutran.demo;

import com.itphutran.ex.Season;

public class Ex1 {

	public static void main(String[] args) {
		System.out.println(Season.getJob("SPRING"));
	}
}

Đây là một trong những cách chúng ta hay làm và tất nhiên các này là hoàn toàn chính xác đề giải quyết bài toán trên. Tuy nhiên có 2 điều bất cập khi sử dụng cách trên mà ta cần giải quyết là:

1.Gía trị mà người dùng cho vào method getJob là một chuỗi bất kỳ, không phải là 1 trong bốn giá trị cho 4 mùa trên.

2.Ngay tại class Season thì khi lập trình chúng ta có thể cho giá trị có thể viết nhầm trùng nhau, dẫn đến kết quả logic không chính xác.

Vậy để khắc phục hai nhược điểm trên Enum ra đời:

chúng ta có thể khắc phúc bằng cách sử dụng như sau:

class Season.java

package com.itphutran.ex;

public enum Season {
 SPRING, SUMMER, AUTUMN, WINTER;

 public static String getJob(Season season) {
 return (season.equals(Season.SPRING)) ? "Mùa ăn chơi!" : "Làm việc!";
 }
}

class Ex2.java

package ccom.itphutran.demo;

import com.itphutran.ex.Season;

public class Ex2 {

	public static void main(String[] args) {
		System.out.println(Season.getJob(Season.SPRING));
	}

}




Như vậy, các bạn thấy rằng, với enum thì ở enum Season nó không thể trùng giá trị, nếu cố tính cho cùng một giá trị mà chúng ta định nghĩa thì ngay tập tức báo lỗi trong thời gian compile do IDE hỗ trợ.

Thứ 2, tham số truyền vào phải là một trong 4 giá trị trên trong enum Season.

Với enum thì nó là danh sách các object cố định. Như vậy chúng ta cần phải biết trước các object, như ví dụ trên, chúng ta có 4 object tương ứng với bốn mùa.

Một khi đã gọi enum sử dụng thì nó sẽ tạo ra tất cả các object do mình khai báo trong enum đó,

Và đôi khi với mỗi mùa thì nó lại có mã của mùa đó và tên tiếng việt, tiếng anh. Như vậy chúng ta phải làm bằng cách nào?

Như tôi nói ở phần đầu bài, nó cũng giống như một class, có các thuộc tính và constructor cho nên tôi xử lý như sau:

package com.itphutran.ex;

public enum Season {
	SPRING("sp", "Mùa xuân", "Spring"), SUMMER("sm", "Mùa Hạ", "Summer"), AUTUMN("at", "Mùa thu",
			"Autumn"), WINTER("wt", "Mùa đông", "Winter");

	private String ma;
	private String tiengViet;
	private String tiengAnh;

	private Season(String ma, String tiengViet, String tiengAnh) {
		this.ma = ma;
		this.tiengViet = tiengViet;
		this.tiengAnh = tiengAnh;
	}

	public String getMa() {
		return ma;
	}

	public void setMa(String ma) {
		this.ma = ma;
	}

	public String getTiengViet() {
		return tiengViet;
	}

	public void setTiengViet(String tiengViet) {
		this.tiengViet = tiengViet;
	}

	public String getTiengAnh() {
		return tiengAnh;
	}

	public void setTiengAnh(String tiengAnh) {
		this.tiengAnh = tiengAnh;
	}

	public static String getJob(Season season) {
		return (season.equals(Season.SPRING)) ? "Mùa ăn chơi!" : "Làm việc!";
	}
}

Ex2.java sử dụng như sau:

package ccom.itphutran.demo;

import com.itphutran.ex.Season;

public class Ex2 {

	public static void main(String[] args) {
		Season seasonSP = Season.SPRING;
		// lấy giá trị tên object (enum)
		System.out.println(seasonSP.toString());
		// set giá trị thuộc tính cho object 
		seasonSP.setMa("spnew");
		// lấy giá trị thuộc tính của object enum
		System.out.println(seasonSP.getTiengViet());
	}

}

Như vậy, các bạn thấy rằng, như ở phần đầu bài các object thì cố định nhưng giá trị thuộc tính của các object đó cót thay đổi không?  Như ví dụ trên, ta setMa là object seasonSP thì  giá trị của thuộc tính mã đó sẽ thay đổi.

3.Enum hay là hay cái gì?

Theo tôi thì có hai lợi ích chính mà cần phải lưu ý:

  • Tường minh: nghĩa là một object SPRING nó mang ý nghĩa là một spring và kiểu dữ liệu của nó phải đúng với những giá trị object mà chúng ta đã khai báo.

Trước JDK7 thì Java hỗ trợ 2 loại switch case thôi, một là kiểu int hai là kiểu enum.

Cho nên với trường hợp muốn kiểm tra mùa trong năm sau đó in ra mùa đó chẳng hạn thì ta phải if else nhiều lần, thay vì như vậy sử dụng:

  • Sử dụng trong switch – case: một trong những lợi ích nổi trội nhất của enum là cho phép sử dụng như variable trong switch – case.

Với những phân tích trên mình nghĩ các bạn đã nắm được enum rồi , nhưng bây giờ hãy cùng nhau trả lời một số câu hỏi phỏng vấn xem thử nhé:

Câu hỏi phỏng vấn về enum trong java thường gặp:

1.Chúng ta có thể tạo ra thể hiện của enum bằng từ khoá new không?

Trả lời: Không, bởi vì nó chỉ có các Constructor private.

2. Chúng ta có thể khai báo phương thức trừu tượng trong enum không?

Có, chúng ta có thể có các phương thức trừu tượng và có thể cung cấp việc thực hiện các phương thức này. (Thằng này mình nghĩ nó ít áp dụng và ít dùng)

3. Lợi ích của việc sử dụng enum so với việc khai báo public static final là gì? 

Hai cách hầu như tương tự nhau, tuy nhiên trường hợp khi khai báo là public static final thì nó chỉ lưu trữ duy nhất một giá trị, nhưng với enum nó có thể lưu được 1 object, nhiều thuộc tính khác nhau như ví dụ 4 mùa trong năm.


Qua bài viết này, Enum là gì? lợi ích của enum là gì? áp dụng như thế nào? Mình nghĩ các bạn đã năm chắc rồi đúng không?  Nếu có một ai đó hỏi về enum hãy trả lời nhanh, ngắn gọn, xúc tích! Xin chào và hẹn gặp lại các bạn qua những bài viết sau nhé.



0 0 đánh giá
Đánh giá bài viết
Theo dõi
Thông báo của
guest
0 Góp ý
Phản hồi nội tuyến
Xem tất cả bình luận
x