GP Coder

Trang chia sẻ kiến thức lập trình Java

  • Java Core
    • Basic Java
    • OOP
    • Exception Handling
    • Multi-Thread
    • Java I/O
    • Networking
    • Reflection
    • Collection
    • Java 8
  • Design pattern
    • Creational Pattern
    • Structuaral Pattern
    • Behavior Pattern
  • Web Service
    • SOAP
    • REST
  • JPA
  • Java library
    • Report
    • Json
    • Unit Test
  • Message Queue
    • ActiveMQ
    • RabbitMQ
  • All
Trang chủ Java Core Basic Java Enum trong java

Enum trong java

Đăng vào 09/11/2017 . Được đăng bởi GP Coder . 27239 Lượt xem . Toàn màn hình

enum là một từ khóa trong Java, là một kiểu dữ liệu đặc biệt được sử dụng để đại diện cho hằng số cố định.

Một enum có thể chứa các trường, phương thức và constructor.

Bởi vì các giá trị của Enum là các hằng số, nên tên của các trường kiểu enum thường là các chữ cái hoa.

Trong ngôn ngữ lập trình Java, bạn xác định một kiểu enum bằng cách sử dụng từ khóa enum. Ví dụ, sử dụng enum để định nghĩa các ngày trong tuần (SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY), các mùa trong năm (SPRING, SUMMER, FALL, WINTER), …

Nội dung

  • 1 Khai báo enum
  • 2 Duyệt các phần tử trong enum
  • 3 Khởi tạo giá trị đặc biệt cho hằng số enum
  • 4 So sánh các phần tử java enum
  • 5 Enum có thể sử dụng như tham số trong câu lệnh switch
  • 6 Ghi đè phương thức trong Enum
  • 7 Phương thức trừu tượng (abstract method) trong Enum
  • 8 Enum có thể implement một Interface

Khai báo enum

Trong Java, enum  có thể được định nghĩa bên trong hoặc bên ngoài một lớp, vì nó tương tự như lớp trong java.

Ví dụ enum định nghĩa bên trong một lớp


public class EnumExample {
	enum WeekDay {
		MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY;
	}

	public static void main(String[] args) {
		WeekDay d = WeekDay.MONDAY;
        	System.out.println(d);
	}
}

Kết quả thực thi chương trình trên:

MONDAY

Ví dụ enum định nghĩa bên ngoài một lớp

enum WeekDay { // Không được khai báo access modifier (sử dụng default)
	MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY;
}

public class EnumExample {
	public static void main(String[] args) {
		WeekDay d = WeekDay.MONDAY;
        	System.out.println(d);
	}
}

Kết quả thực thi chương trình trên:

MONDAY

Lưu ý: enum định nghĩa bên ngoài một lớp không thể dụng access modifier public, protected, private.

Ví dụ enum định nghĩa trong một file riêng biệt

WeekDay .java

public enum WeekDay {
	MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY;
}

EnumExample.java

public class EnumExample {
	public static void main(String[] args) {
		WeekDay d = WeekDay.MONDAY;
        	System.out.println(d);
	}
}

Kết quả thực thi chương trình trên:

MONDAY

Duyệt các phần tử trong enum

Chúng ta có thể duyệt trên tất cả các phần tử của Enum, thông qua method values().

Trình biên dịch trong java tự động thêm phương thức values() vào enum khi nó được biên dịch. Phương thức values() trả về một mảng chứa tất cả các giá trị của enum.

Ví dụ:


public class EnumExample {
	enum WeekDay {
		MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY;
	}

	public static void main(String[] args) {
		for (WeekDay d : WeekDay.values()) {
			System.out.println(d);
		}

	}
}

Kết quả thực thi chương trình trên:

MONDAY
TUESDAY
WEDNESDAY
THURSDAY
FRIDAY
SATURDAY
SUNDAY

Khởi tạo giá trị đặc biệt cho hằng số enum

Các hằng số enum có giá trị ban đầu bắt đầu từ 0, 1, 2, 3, … Nhưng chúng ta có thể khởi tạo giá trị cụ thể cho các hằng số enum bằng cách định nghĩa các trường và các Constructor. Như đã giới thiệu, Enum có thể có các trường, phương thức và Constructor.

Constructor của enum trong java là private. Khi bạn không khai báo là private thì trình biên dịch sẽ tạo ra constructor private không có tham số.

Các phần tử trong enum luôn là static final.

Có thể viết một static method trong enum.

Ví dụ:

public class EnumExample3 {
	enum WeekDay {
		// Khởi tạo các phần tử từ construnctor
		// Các phần tử này luôn là static final
		MONDAY(2), TUESDAY(3), WEDNESDAY(4), THURSDAY(5), FRIDAY(7), SATURDAY(7), SUNDAY(1);

		private int value;

		// constructor này chỉ dùng trong nội bộ Enum
		// Modifier của constructor enum luôn là private
		// Nếu không khai báo private, java cũng sẽ hiểu là private.
		WeekDay(int value) {
			this.value = value;
		}

		// Có thể viết một static method lấy ra WeekDay theo value.
		public static WeekDay getWeekDayByValue(int value) {
			for (WeekDay d : WeekDay.values()) {
				if (d.value == value) {
					return d;
				}
			}
			return null;
		}
	}

	public static void main(String[] args) {
		for (WeekDay d : WeekDay.values()) {
			System.out.println(d + " = " + d.value);
		}

		// Sử dụng static method của enum
		WeekDay d = WeekDay.getWeekDayByValue(3);
		System.out.println("value 3 is " + d);
	}
}

Kết quả thực thi chương trình trên:

MONDAY = 2
TUESDAY = 3
WEDNESDAY = 4
THURSDAY = 5
FRIDAY = 7
SATURDAY = 7
SUNDAY = 1
value 3 is TUESDAY

So sánh các phần tử java enum

Enum là một đối tượng tham chiếu giống như class, interface nhưng nó cũng có thể sử dụng toán tử == hoặc  equals() để so sánh các phần tử enum.


public class EnumExample {
	enum WeekDay {
		MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY;
	}

	public static void main(String[] args) {
		WeekDay today = WeekDay.SUNDAY;

		// use equal() method
		if (today.equals(WeekDay.SUNDAY)) {
			System.out.println("Today is holiday");
		} else {
			System.out.println("Today is working day");
		}

		// use == operator
		if (today == WeekDay.SUNDAY) {
			System.out.println("Today is holiday");
		} else {
			System.out.println("Today is working day");
		}
	}
}

Kết quả thực thi chương trình trên:

Today is holiday
Today is holiday

Enum có thể sử dụng như tham số trong câu lệnh switch

Cũng giống với các kiểu dữ liệu nguyên thủy (int,float,..) Enum có thể sử dụng như một tham số trong câu lệnh switch.

public class EnumExample {
	enum WeekDay {
		MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY;
	}

	public static void main(String[] args) {
		WeekDay today = WeekDay.SUNDAY;

		switch (today) {
		case MONDAY:
			System.out.println("Today is working day");
			break;
		case SATURDAY:
		case SUNDAY:
			System.out.println("Today is holiday");
			break;
		default:
			System.out.println(today);
		}
	}
}

Kết quả thực thi chương trình trên:

Today is holiday

Ghi đè phương thức trong Enum

Do enum cũng là một kiểu dữ liệu được kết thừa từ lớp Object, nên chúng ta có thể ghi đè method toString() của lớp Object.

Ví dụ:

public class EnumExample3 {
	enum WeekDay {
		MONDAY(2), TUESDAY(3), WEDNESDAY(4), THURSDAY(5), FRIDAY(7), SATURDAY(7), SUNDAY(1);

		private int value;

		WeekDay(int value) {
			this.value = value;
		}

		@Override
		public String toString() {
			if (value == 1) { // other way: if (this == SUNDAY) {
				return "Today is holiday";
			} else {
				return "Today is working day";
			}
		}
	}

	public static void main(String[] args) {
		WeekDay today = WeekDay.SUNDAY;
		System.out.println(today);
		System.out.println(today.toString());
	}
}

Kết quả thực thi chương trình trên:

Today is holiday
Today is holiday

Phương thức trừu tượng (abstract method) trong Enum

Ví dụ:

Color.java

public enum Color {

	RED("red") {
		@Override
		public String getHexCode() {
			return "#ff0000";
		}
	},
	GREEN("green") {
		@Override
		public String getHexCode() {
			return "#00ff00";
		}
	},
	BLUE("blue") {
		@Override
		public String getHexCode() {
			return "#0000ff";
		}
	};

	private String name;

	Color(String name) {
		this.name = name;
	}

	public String getName() {
		return name;
	}

	public abstract String getHexCode();

}

EnumExample.java

public class EnumExample {
	public static void main(String[] args) {
		for (Color color : Color.values()) {
			System.out.println(color.getName() + " = " + color.getHexCode());
		}
	}
}

Kết quả thực thi chương trình trên:

red = #ff0000
green = #00ff00
blue = #0000ff

Enum có thể implement một Interface

Ví dụ:


package com.gpcoder.enumdemo;

import java.util.Arrays;

interface Option {
	int getValue();

	String getLabel();
}

enum Gender implements Option {
	MALE(1, "Male"), FEMALE(2, "Female");

	private int value;
	private String label;

	private Gender(int value, String label) {
		this.value = value;
		this.label = label;
	}

	@Override
	public int getValue() {
		return value;
	}

	@Override
	public String getLabel() {
		return label;
	}
}

enum Country implements Option {
	VIETNAM(1, "Viet Nam"), ENGLAND(2, "England");

	private int value;
	private String label;

	private Country(int value, String label) {
		this.value = value;
		this.label = label;
	}

	@Override
	public int getValue() {
		return value;
	}

	@Override
	public String getLabel() {
		return label;
	}
}

public class EnumExample6 {
	public static void main(String[] args) {
		Option[] countries = Country.values();
		Option[] genders = Gender.values();

		System.out.println(Arrays.asList(countries));
		System.out.println(Arrays.asList(genders));
	}
}

Output của chương trình:


[VIETNAM, ENGLAND]
[MALE, FEMALE]

Tài liệu tham khảo:

  • https://www.javatpoint.com/enum-in-java
  • https://docs.oracle.com/javase/tutorial/java/javaOO/enum.html
  • http://o7planning.org/vi/10199/huong-dan-su-dung-java-enum
5.0
10
Nếu bạn thấy hay thì hãy chia sẻ bài viết cho mọi người nhé! Và Donate tác giả

Shares

Chuyên mục: Basic Java Được gắn thẻ: Enum, OOP

Xử lý ngoại lệ đối với trường hợp ghi đè phương thức trong java
Collection trong java

Có thể bạn muốn xem:

  • Truyền giá trị (pass by value) trong java (03/11/2017)
  • Tạo chương trình Java đầu tiên sử dụng Eclipse IDE (19/10/2017)
  • Tạo số và chuỗi ngẫu nhiên trong Java (15/09/2019)
  • Tổng quan về ngôn ngữ lập trình java (18/10/2017)
  • Integer Constant Pool trong Java (03/02/2018)

Bình luận

bình luận

Tìm kiếm

Bài viết mới

  • Clean code 13/01/2024
  • Giới thiệu CloudAMQP – Một RabbitMQ server trên Cloud 02/10/2020
  • Kết nối RabbitMQ sử dụng Web STOMP Plugin 19/06/2020
  • Sử dụng publisher confirm trong RabbitMQ 16/06/2020
  • Sử dụng Dead Letter Exchange trong RabbitMQ 13/06/2020

Xem nhiều

  • Hướng dẫn Java Design Pattern – Factory Method (98065 lượt xem)
  • Hướng dẫn Java Design Pattern – Singleton (97704 lượt xem)
  • Giới thiệu Design Patterns (87776 lượt xem)
  • Lập trình đa luồng trong Java (Java Multi-threading) (86444 lượt xem)
  • Giới thiệu về Stream API trong Java 8 (83840 lượt xem)

Nội dung bài viết

  • 1 Khai báo enum
  • 2 Duyệt các phần tử trong enum
  • 3 Khởi tạo giá trị đặc biệt cho hằng số enum
  • 4 So sánh các phần tử java enum
  • 5 Enum có thể sử dụng như tham số trong câu lệnh switch
  • 6 Ghi đè phương thức trong Enum
  • 7 Phương thức trừu tượng (abstract method) trong Enum
  • 8 Enum có thể implement một Interface

Lưu trữ

Thẻ đánh dấu

Annotation Authentication Basic Java Behavior Pattern Collection Creational Design Pattern Cấu trúc điều khiển Database Dependency Injection Design pattern Eclipse Exception Executor Service Google Guice Gson Hibernate How to Interceptor IO Jackson Java 8 Java Core JDBC JDK Jersey JMS JPA json JUnit JWT Message Queue Mockito Multithreading OOP PowerMockito RabbitMQ Reflection Report REST SOAP Structuaral Pattern Swagger Thread Pool Unit Test Webservice

Liên kết

  • Clean Code
  • JavaTpoint
  • Refactoring Guru
  • Source Making
  • TutorialsPoint
  • W3Schools Online Web Tutorials

Giới thiệu

GP Coder là trang web cá nhân, được thành lập với mục đích lưu trữ, chia sẽ kiến thức đã học và làm việc của tôi. Các bài viết trên trang này chủ yếu về ngôn ngữ Java và các công nghệ có liên quan đến Java như: Spring, JSF, Web Services, Unit Test, Hibernate, SQL, ...
Hi vọng góp được chút ít công sức cho sự phát triển cộng đồng Coder Việt.

Donate tác giả

Tìm kiếm các bài viết của GP Coder với Google Search

Liên hệ

Các bạn có thể liên hệ với tôi thông qua:
  • Trang liên hệ
  • Linkedin: gpcoder
  • Email: contact@gpcoder.com
  • Skype: ptgiang56it

Follow me

Copyright 2025 © GP Coder · All Rights Reserved · Giới thiệu · Chính sách · Điều khoản · Liên hệ ·

Share

Blogger
Delicious
Digg
Email
Facebook
Facebook messenger
Flipboard
Google
Hacker News
Line
LinkedIn
Mastodon
Mix
Odnoklassniki
PDF
Pinterest
Pocket
Print
Reddit
Renren
Short link
SMS
Skype
Telegram
Tumblr
Twitter
VKontakte
wechat
Weibo
WhatsApp
X
Xing
Yahoo! Mail

Copy short link

Copy link