2010-07-12 38 views
45

Nếu tôi có một đối tượng enum, nó được coi là một nguyên thủy hoặc một tài liệu tham khảo?Các enums Java có được coi là các kiểu nguyên thủy hay tham chiếu không?

+0

Enums là lớp học hoàn toàn bình thường w/một số tối ưu hóa (serialization) + kiểm tra c-tor cho cấp thừa kế + mảng chia sẻ thêm (không nhân bản()) của các enums được khai báo. Giá trị phương thức công khai() luôn trả về một bản sao mới. Họ có thể thực hiện các giao diện và những gì không :) – bestsss

Trả lời

50

Đây là loại tham chiếu.

Không giống như nhiều ngôn ngữ, trong đó enum là tập hợp các dấu tách rời, Java enums là trường hợp đối tượng bất biến. Bạn có thể lấy giá trị số của một cá thể enum bằng cách gọi ordinal().

Bạn thậm chí có thể thêm các thành viên của riêng bạn để lớp enum, như thế này:

public enum Operation { 
    PLUS { double eval(double x, double y) { return x + y; } }, 
    MINUS { double eval(double x, double y) { return x - y; } }, 
    TIMES { double eval(double x, double y) { return x * y; } }, 
    DIVIDE { double eval(double x, double y) { return x/y; } }; 

    // Do arithmetic op represented by this constant 
    abstract double eval(double x, double y); 
} 
//Elsewhere: 
Operation op = Operation.PLUS; 
double two = op.eval(1, 1); 
+0

+1 Tôi hoàn toàn không biết về chức năng này. Bạn có thể cung cấp một ví dụ về cách sử dụng hoạt động đó trong hành động không? – corsiKa

+10

'trường hợp enum' không phải là bất biến thực sự. Một enum có thể có các biến có thể thay đổi. – sepp2k

+0

@glowcoder: 'Operation.PLUS.eval (1, 1)' – SLaks

0

This article chủ yếu chỉ cho bạn cách đếm được thực hiện, và như SLaks nói, họ là tài liệu tham khảo.

10

Các enums cách làm việc thực sự là không quá khác biệt so với cách họ đã được sử dụng trước khi giới thiệu họ với Java 5:

public final class Suit { 

public static final Suit CLUBS = new Suit(); 
public static final Suit DIAMONDS = new Suit(); 
public static final Suit HEARTS = new Suit(); 
public static final Suit SPADES = new Suit(); 

/** 
* Prevent external instantiation. 
*/ 
private Suit() { 
    // No implementation 
}} 

By instantiating bộ quần áo khác nhau trên lớp bốc nó được đảm bảo rằng chúng sẽ được loại trừ lẫn nhau và các nhà xây dựng tư nhân đảm bảo rằng không có trường hợp thêm sẽ được tạo ra.

Đây có thể so sánh thông qua == hoặc bằng.

Java 5 enum hoạt động khá nhiều theo cùng một cách, nhưng với một số tính năng cần thiết để hỗ trợ serialization, vv

Tôi hy vọng nền tảng này làm sáng tỏ hơn nữa.

Các vấn đề liên quan