Làm cách nào tôi có thể tham chiếu đến Java Enum của mình mà không chỉ định loại của nó


83

Tôi có một lớp định nghĩa enum của riêng nó như thế này:

public class Test
{
    enum MyEnum{E1, E2};

    public static void aTestMethod() {
        Test2(E1);  // << Gives "E1 cannot be resolved" in eclipse.
    }
    public Test2(MyEnum e) {}
}

Nếu tôi chỉ định MyEnum.E1 thì nó hoạt động tốt, nhưng tôi thực sự muốn đặt nó là "E1". Bất kỳ ý tưởng nào về cách tôi có thể thực hiện điều này, hoặc nó phải được xác định trong một tệp khác để điều này hoạt động?

KẾT LUẬN: Tôi không thể hiểu cú pháp nhập chính xác. Vì một số câu trả lời gợi ý điều này là khả thi, tôi sẽ chọn một câu trả lời cho tôi cú pháp tôi cần và tán thành những câu trả lời khác.

Nhân tiện, một phần THỰC SỰ CẠNH TRANH của điều này (trước khi tôi bắt nhập tĩnh hoạt động), một câu lệnh chuyển đổi mà tôi đã viết sử dụng enum không cho phép enum được bắt đầu bằng kiểu của nó - tất cả phần còn lại của mã yêu cầu nó. Đau đầu.


9
Về hành vi "thực sự kỳ lạ" trên các câu lệnh switch: Java thực hiện điều này trên tất cả các enums trong một câu lệnh switch. Vì bạn biết bạn đang bật kiểu nào, họ cho rằng không có lý do gì để bạn chỉ định lại kiểu trong mọi khối trường hợp. download.oracle.com/javase/tutorial/java/javaOO/enum.html
StriplingWarrior

1
Tôi đoán điều liên quan đến tôi là nó sẽ không cho phép tiền tố loại Enum. Tiền tố ở mọi nơi khác là bắt buộc (nếu không được nhập) hoặc tùy chọn.
Bill K

Tôi đồng ý với bạn về sự switchkhông nhất quán, khiến các lập trình viên Java ít kinh nghiệm phải vò đầu bứt tai.
jmarkmurphy

Câu trả lời:


134

Trên thực tế, bạn có thể nhập tĩnh một enum lồng nhau. Đoạn mã dưới đây biên dịch tốt:

package mypackage;

import static mypackage.Test.MyEnum.*;

public class Test
{
    enum MyEnum{E1, E2};

    public static void aTestMethod() {
        Test2(E1);  
    }

    public static void Test2(MyEnum e) {}
}

1
Tôi đã ám chỉ đây là một giải pháp trong câu hỏi của mình, nhưng tôi thực sự không muốn làm vậy. Các enum chỉ được sử dụng bên trong một tệp này. Có vẻ như lạ là điều này không chỉ tự động hoạt động.
Bill K

Mặc dù bạn phải sử dụng phép nhập tĩnh, nhưng bạn không cần phải định nghĩa nó trong lớp riêng của nó.
Yishai

5
@Bill K, bạn nghĩ tại sao nó phải tự động hoạt động? Bạn mong đợi điều này sẽ hoạt động như thế nào sau đó? lớp A {enum B {X, Y}; enum C {X, Z}; }
Kevin Bourrillion

2
Giải pháp này chỉ hoạt động vì MyEnum hiển thị bên ngoài Thử nghiệm. Giải pháp sẽ không hoạt động nếu MyEnum, ví dụ, là riêng tư.
Chry Cheng

2
Đừng quên phần cuối cùng, ký hiệu ". *" Trong "nhập tĩnh mypackage.Test.MyEnum. *;" như tôi đa lam!
joro

17

Bạn có thể thực hiện nhập tĩnh trên một lớp lồng nhau:

import static apackage.Test.Enum.*;

6

Lớp Test phải được định nghĩa trong một gói để có thể nhập được.

Với gói được định nghĩa trong Test( CÔNG TRÌNH CNTT ):

package mypackage;

Bạn có thể dùng:

import static mypackage.Test.MyEnum.*;

Nếu không có gói được xác định, bạn không thể sử dụng ( KHÔNG LÀM VIỆC ):

import static Test.MyEnum.*;
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.