2016-08-25 3 views
-2

우리가하는 일은 - Annotation driven Null과 empty values는 Object를 검사합니다.Null 검사에 사용할 디자인 패턴

우리가하는 일 - 하나의 주석을 작성하고 그 주석을 변수 선언에 두는 것.

나는 내가 그것을

을 가장 잘 작동하도록 사용하는 데 필요한 디자인 패턴 모르겠습니다. 제발 제안 해주세요.

주석 클래스 - 우리가

@Target(ElementType.FIELD) 


@Retention(RetentionPolicy.RUNTIME) 

public @interface Test { 


/** 
* Message. 
* 
* @return the string 
*/ 
public String message(); 

} 

를 선언하는 방법은 변수 -

@Test(message="five message") 
private String five; 

것은 내가 주석 프로세서를 호출하고 방법 -

Class<?> annotationClass = annotationTestinClass.getClass(); 
    Field[] decalaredFieldsArray = annotationClass.getDeclaredFields(); 
    List<String> lstString = new ArrayList<>(); 
    parseFields(decalaredFieldsArray,annotationTestinClass,lstString); 

내가 처리하고 어떻게 객체 -

public static List<String> parseFields(Field[] decalaredFieldsArray,Object obj,List<String> lstString){ 

    Arrays.stream(decalaredFieldsArray).forEach(field ->{ 
     field.setAccessible(true); 
     Test test = field.getDeclaredAnnotation(Test.class); 
     if(field.getType().isPrimitive() || field.getType().getName().equals("java.lang.String")){ 
      if(field.isAnnotationPresent(Test.class)){ 
       try { 
        System.out.println("field value is :"+field.get(obj)); 
        System.out.println("field Name is :"+field.getName()); 
        if(field.get(obj)== null || !StringUtils.isNoneBlank(field.get(obj).toString())){ 
         lstString.add(test.message()); 
        } 

       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     }else{ 
      Field[] objectFields =null; 
      Object objValue = null; 
      try { 
       if(field.isAnnotationPresent(Test.class)){ 
        objValue = field.get(obj); 
        if(objValue!=null){ 
         objectFields = objValue.getClass().getDeclaredFields(); 
         parseFields(objectFields, objValue, lstString); 
        }else{ 
         System.out.println("Object value is -"+field.get(obj)); 
         System.out.println("Messsage value is -"+test.message()); 
         lstString.add(test.message()); 
        } 
       } 

      } catch (Exception e1) { 
       e1.printStackTrace(); 
      } 

     } 

    }); 
    return lstString; 
} 

여기 Test.Class가 내 Test 주석을 다시 작성합니다.

+0

선언에서 변수에 주석을 추가하는 경우 - 어떤 시점에서 null을 확인 하시겠습니까? 그 선언에서 바로? 매 2 주 일요일? 코드의 어느 부분이 해당 체크를 호출하거나 실행할 것입니까? – f1sh

+1

null 개체 패턴 시도 : http://www.tutorialspoint.com/design_pattern/null_object_pattern.htm –

+0

'선택 사항 '옵션이 있습니까? – ChiefTwoPencils

답변

1

어노테이션이 그렇게 작동하지 않습니다.

컴파일 타임에 처리되는 사용자 정의 주석을 만들 수 있습니다. 그러나 컴파일 할 때 매우 자주 체크 할 수 있습니다.

@NotNull 
private Whatever foo = someBar(); 

은 실제로 "not null"로 연결됩니다. 즉, 컴파일시 주석이 달린 변수가 실제로 null이 아닌 경우 모든 경우에 @NotNull 뒤에 숨겨진 코드가 실제로 결정될 수 없습니다.

런타임시 주석은 ... 단지 메타 정보! 의미 : 주석이 런타임에 효과를 가지게하려면, 작업을 수행 할 때 주석을 확인하는 코드가 필요합니다.

예 : @Persist를 생성합니다.

그리고 나서 "개체를 처리하는"프레임 워크가 있습니다. 그리고 해당 프레임 워크 프로세스가 일부 객체를 처리 할 때마다 해당 주석이 있는지 확인할 수 있습니다. 그렇다면 해당 객체를 "유지"합니다. 즉

:

foo = bar; 

단지 foo는 할 줄을 지정합니다; foo가 @NotNull 주석이 있는지 검사 할 수있는 "프레임 워크 없음"이 있으며, bar가 null 인 경우 해당 할당에 대해 작업을 수행합니다. 당신이 도움이 될 수 있도록

그래서, 위해, 당신이 필요로하는

  1. 그 새 주석
  2. 객체에서 작동 "프로세서"어떤 종류의; 주석을 달았는지 확인합니다. 주석을 달았다면 특별한 일이 일어난다.
+0

고마워요! 우리는 우리 자신의 주석만을 만들었지 만 디자인 접근법에 대해서는 확신이 없습니다. 당신도 저를 도울 수있게 해주시겠습니까? –

+1

마지막 업데이트보기 : 요점은 ** 프레임 워크 **와 유사한 코드가있는 경우에만 이러한 주석이 적용됩니다. – GhostCat