Item 39ネーミングモードと比較して、アニメーションを使用

11080 ワード

ネーミング・モードの欠点

  • エラーは発生しません
  • 正しいプログラム要素のみで使用することは保証できません.
  • プログラム要素をパラメータとして伝達する適切な方法はない.
  • トレーニングは以上のすべての問題を解決します。


    コード39-1タグタイプ宣言
    import java.lang.annotation.*;
    
    /**
     * 테스트 메서드임을 선언하는 애너테이션인다. 
     * 매개변수 없는 정적 메서드 전용이다. 
     */
    @Retention(RetentionPolicy.RUNTIME)
    @Target(ElementType.METHOD)
    public @interface Test {
    }
    @Reentionや@Targetなど
    宣言中の注釈をメタ注釈と呼ぶ.
    @Reention(保存ポリシー.RUNTIME)メタデータは、@Testが実行時にも保持する必要があることを示します.
    このメタデータを省略すると、テストツールは@Testを認識できません.
    一方,@Target(ElementType.METHOD)メタデータは,@Testがメソッド宣言のみで使用される必要があることを示している.
    したがって、クラス宣言、フィールド宣言などの他のプログラム要素と一致することはできません.
    サンプルコード39-2タグ説明
    public class Sample {
        @Test public static void m1() { } // 성공해야 한다.
        public static void m2() {}
        @Test public static void m3() {  // 실패해야 한다.
            throw new RuntimeException("실패");
        }
        public static void m4() {}
        @Test public void m5() { } // 잘못 사용한 예: 정적 메서드가 아니다.
        @Test public static void m7() {  // 실패해야 한다.
            throw new RuntimeException("실패");
        }
        public static void m8() {}
    処理コード39-3タグ説明のプログラム
    import java.lang.reflect.*;
    
    public class RunTests {
        public static void main(String[] args) throws Exception {
            int tests = 0;
            int passed = 0;
            Class<?> testClass = Class.forName(args[0]);
            for (Method m : testClass.getDeclaredMethods()) {
                if(m.isAnnotationPresent(Test.class)) {
                    test++;
                    try {
                        m.invoke(null);
                        passed++;
                    } catch (InvocationTargetException wrappedExc) {
                        Throwable exc = wrappedExc.getCause();
                        System.out.println(m + " 실패: " + exc);
                    } catch (Exception exc) {
                        System.out.println("잘못 사용한 @Test: " + m);
                    }
                }
            }
            System.out.printf("성공: %d, 실패: %d%n", passed, tests-passed);
        }
    }
    中略
    アニメーションでできることをネーミングモードで処理する理由はありません.
    Javaプログラマーの場合は、Javaが提供するプレゼンテーションタイプを使用します.