2012-08-24 35 views
5

tôi tạo enums tôi qua phản ánh, cho rằng tôi thêm vào mỗi enum một lớp bên trong mà thực hiện các trừu tượng nhà máy. Bây giờ tôi muốn truy cập vào lớp bên trong này để gọi phương pháp:Annotate lớp với lớp bên trong

@Factory(FooFactory.class) 
public enum Foo { 

    FOO, BAR; 

    public class FooFactory implements AbstractFactory<Foo> { 

      public Foo create(String value) { 
       return valueOf(value.toUpperCase()); 
      } 
    } 
} 

Định nghĩa của @Factory là:

@Retention(RetentionPolicy.RUNTIME) 
public @interface Factory { 

     Class<?> value(); 
} 

Với điều này, tuy nhiên, tôi nhận được lỗi sau:

Không thể giải quyết lớp học thành loại FooFactory.java

Khi tôi cố gắng @Factory(Foo$FooFactory.class) tôi nhận được lỗi :

Các lồng nhau Foo $ FooFactory không thể referneced sử dụng tên nhị phân của nó.

Vì vậy, thậm chí có thể tham chiếu một lớp lồng nhau không?

+0

Tôi nghi ngờ FooFactory cần phải là 'lớp tĩnh công cộng'. – Charlie

+0

@Charlie Tôi đã thử điều đó rồi. –

+1

enums thường dành cho các giá trị cố định, đã biết. Điều này có vẻ kỳ lạ. –

Trả lời

7

Từ các ý kiến ​​... rõ ràng

@Factory(Foo.FooFactory.class) 

là cần thiết.

4

Bạn đang sử dụng lớp lồng nhau không tĩnh, được sắp xếp theo từng cá thể của enum.

Thay vào đó, bạn cần một lớp lồng nhau tĩnh, như vậy:

public static class FooFactory implements AbstractFactory<Foo> { 

     public static Foo create(String value) { 
      return valueOf(value.toUpperCase()); 
     } 
} 

Tuy nhiên, tất cả điều này là không cần thiết: bạn chỉ có thể gọi Foo.valueOf(value) để đạt được mục tiêu này. Tôi không thấy bất kỳ giá trị gia tăng nào ở đây (không có ý định chơi chữ).

Factory.java

import java.lang.annotation.*; 
@Retention(RetentionPolicy.RUNTIME) 
public @interface Factory { 
     Class<?> value(); 
} 

FooEnum.java

@Factory(FooEnum.FooFactory.class) 
public enum FooEnum { 
    FOO, BAR; 
    public static class FooFactory { 

      public static FooEnum create(String value) { 
       return valueOf(value.toUpperCase()); 
      } 
    } 
} 

FooEnumMain.java

public class FooEnumMain { 
    public static void main(String[] args) { 
     FooEnum f = FooEnum.FooFactory.create("foo"); 
     System.out.println(f); 
    } 
} 
+0

Sau đó, bạn có một cái gì đó khác đang xảy ra mà bạn không nói với chúng tôi về. Tôi đã có thể thiết lập để hoạt động của bạn. Tôi sẽ chỉnh sửa trong các mẫu mã. – corsiKa

+0

Nó thực sự hoạt động, nhưng nó không liên quan gì tới công cụ sửa đổi 'tĩnh'. –

3

Tại thời điểm khi chú thích của mình được trình bày, FooFactory là undefined, vì vậy đầy đủ đường dẫn cần phải được chỉ định:

@Factory(Foo.FooFactory.class) 
Các vấn đề liên quan