2008-09-18 7 views
11

Nếu một lớp xác định chú thích, có thể nào đó có thể buộc lớp con của nó xác định cùng một chú thích không?Làm cách nào để buộc một phân lớp Java định nghĩa một chú thích?

Ví dụ, chúng ta có một cặp lớp/lớp con đơn giản mà chia sẻ @Author @interface. Những gì tôi muốn làm là buộc mỗi lớp con hơn nữa để xác định cùng @Author chú thích, ngăn ngừa một RuntimeException đâu đó xuống đường.

TestClass.java:

import java.lang.annotation.*; 

@Retention(RetentionPolicy.RUNTIME) 
@interface Author { String name(); } 

@Author(name = "foo") 
public abstract class TestClass 
{ 
    public static String getInfo(Class<? extends TestClass> c) 
    { 
     return c.getAnnotation(Author.class).name(); 
    } 

    public static void main(String[] args) 
    { 
     System.out.println("The test class was written by " 
         + getInfo(TestClass.class)); 
     System.out.println("The test subclass was written by " 
         + getInfo(TestSubClass.class)); 
    } 
} 

TestSubClass.java:

@Author(name = "bar") 
public abstract class TestSubClass extends TestClass {} 

Tôi biết tôi có thể liệt kê tất cả các chú thích trong thời gian chạy và kiểm tra sự mất tích @Author, nhưng tôi thực sự muốn làm điều này tại thời gian biên dịch, nếu có thể.

Trả lời

3

Tôi khá chắc chắn rằng điều này là không thể làm tại thời gian biên dịch.

Tuy nhiên, đây là một nhiệm vụ rõ ràng đối với thử nghiệm "đơn vị". Nếu bạn có các quy ước như thế này mà bạn muốn thực thi, nhưng có thể khó khăn hoặc không thể kiểm tra với trình biên dịch, các thiết bị "unit" là một cách đơn giản để kiểm tra chúng.

Một khả năng khác là triển khai quy tắc tùy chỉnh trong máy phân tích tĩnh. Có rất nhiều lựa chọn ở đây.

(Tôi đặt đơn vị trong dấu ngoặc kép, vì đây thực sự là một thử nghiệm của các quy ước, chứ không phải của một đơn vị cụ thể. Nhưng nó nên chạy cùng với các bài kiểm tra đơn vị của bạn).

2

Bạn có thể tạo chú thích (ví dụ: @EnforceAuthor) với @Inherited trên lớp cha và sử dụng chú thích trình biên dịch (kể từ Java 1.6) để bắt kịp lúc biên dịch. Sau đó, bạn có tham chiếu đến lớp con và có thể kiểm tra xem có chú thích khác (ví dụ: @Author)) hay không. Điều này sẽ cho phép hủy biên dịch với một thông báo lỗi.