So sánh enum trong Java: toán tử == hay phương thức equals

Trong Java, khi cần so sánh 2 enum, giữa việc dùng toán tử so sánh == và phương thức equals, bạn sẽ dùng cách nào ? Tại sao ?

Câu trả lời của mình là: nên dùng toán tử so sánh ==, tại vì:

  1. Cũng đơn giản là gọi toán tử ==

Nếu nhìn vào định nghĩa của phương thức equals (java.lang.Enum), phương thức này đơn giản chỉ gọi toán tử ==. Vậy tại sao, không gọi thẳng toán tử == khi so sánh 2 enum chứ 🙂

2. An toàn trong quá trình thực thi (Safer at runtime)

Khi gọi phương thức equals trên một null enum thì NullPointerException sẽ được ném ra. Nhưng, nếu dùng toán tử == để so sánh thì không có ngoại lệ ném ra.

Safer at runtime, có một số ý kiến khác, đây ko phải là một nguyên nhân để nên dùng toán tử ==, vì khi so sánh bằng toán tử == chương trình sẽ luôn trả về false khi một trong hai toán hạng là enum null. Khi đó chương trình sẽ tiếp tục thực hiện các công việc tiếp theo trong im lặng, thay thì thông báo một ngoại lệ khi đang so sánh với một giá trị null.

Có thể đặt vào một hoàn cảnh như thế này, dữ liệu về giao dịch của khách hàng (bao gồm việc mua, bán, hoàn trả… ) cần được chuyển qua một cấu trúc mới. Trong quá trình lấy dữ liệu ra từ cấu trúc cũ, nếu như một row dữ liệu mà có trường TransactionTypenull, thì bạn sẽ xử lý như thế nào.

  • Nếu bạn dùng toán tử ==, khi so sánh với enum TransactionType.PURCHASE hoặc TransactionType.REFUND thì kết quả trả về luôn false. Và tất nhiên, chương trình của bạn sẽ tiếp tục thực hiện các công việc tiếp theo, mà bạn sẽ ko biết rằng dữ liệu cần chuyển có vấn đề.
  • Nếu bạn dùng phương thức equals, ngoại lệ NullPointerException được ném ra, đây là một dấu hiệu rõ ràng để bạn có thể điều tra dữ liệu.

Mình đồng ý và cũng không đồng ý với ý kiến trên, nhưng với bản thân mình, mình nghĩ rằng an toàn trong quá trình thực thi là điều có lợi.

3. An toàn trong quá trình biên dịch (Safer at compile time)

Khi bạn so sánh 2 enum khác kiểu bằng toán tử ==, thì trình biên dịch sẽ báo lỗi.

Còn các bạn có ý kiến gì khác không, cùng nhau thảo luận nhé 🙂

Spread the love
  •  
  •  
  •  
  •  
  •  

Leave a Reply

Be the First to Comment!

Notify of
avatar