2010-02-12 9 views
9

열거 형에 의존해야하는 라이브러리를 작성하지만 실제 열거 형은 내 라이브러리 사용자가 정의해야합니다.abstract java enum

다음 예제에서 authorize 메서드에는 열거 형 Permission의 매개 변수가 필요합니다.

acl.authorize(userX, Permission.READ, Permission.WRITE) 

내 라이브러리는 라이브러리 사용자가 정의한 임의의 권한을 처리 할 수 ​​있어야합니다. 하지만 Permission enum이 없으면 라이브러리를 컴파일 할 수 없습니다. 그래서 저는

abstract enum Permission 

과 같은 것이 필요할 것입니다. 이 문제를 해결할 수있는 방법이 있습니까?

답변

21

내가 열거 한 다음 구현하는 것이 인터페이스를 사용합니다.

public interface PermissionType{} 

의 라인을 따라 뭔가가 있습니다.

public enum Permission implements PermissionType 
[...] 

이 그런 다음 API가

+0

JDK7의 "더 많은 NIO 기능"에서 사용되었습니다. 예를 들면 다음과 같습니다. http://download.java.net/jdk7/docs/api/java/nio/file/StandardCopyOption.html –

+3

@ TomHawtin-tackline : 링크가 종료되었습니다. 새 링크를 오래 사용해보십시오. http://docs.oracle.com/javase/7/docs/api/java/nio/file/StandardCopyOption.html –

1

다음은 제가 제안하는 단계입니다.

  1. 은 주석 쓰기 - public @interface Permission
  2. 는 사용자가 주석과의 권한 열거의 각 주석을 만들을 :

    @Permission 
    public enum ConcretePermissionEnum {..} 
    
  3. authorize 방법을 보이게 같은 :

    public boolean authorize(User user, Enum... permissions) { 
        for (Enum permission : permissions) { 
         if (permission.getClass().isAnnotationPresent(Permission.class)){ 
          // handle the permission 
         } 
        } 
    } 
    

당신은 당신은 사용자 열거는 당신의 인터페이스를 구현하는 (대신에 주석하고) 할 수 있습니다, 당신의 권한 열거 몇 가지 구체적인 방법을 갖고 싶어, 아니면 그냥 '마커'를 원하는 경우 :

interface PermissionInterface {..} 
enum ConcretePermission implements PermissionInterface 

이것은 authorize 방법 서명이 같은 찾고, 주석 접근 방식으로, 오히려 런타임 검사보다, 컴파일 시간을 가능하게 할 것이다 :

public boolean authorize(User user, PermissionInterface... permissions) 
+0

내 라이브러리 읽기 권한을 알지 못한다 PermissionType 유형을 사용하여 매개 변수를 받아들이 같은 클라이언트가 열거를 정의합니다. 이 예제는 내 라이브러리의 사용자가 열거 형을 정의하는 사용법을 보여줍니다. 내 라이브러리는 "Permission enum의 일부 요소"만 알아야합니다. – deamon

+0

@daemon 내 업데이트 확인 – Bozho