2014-04-04 43 views
2

我想从注释对象中生成表。现在我有以下模式。我想注释对象如下:Java注释“继承”

@UI.App(
    name = "locations", 
    columns = { 
      @UI.Presenter.PropertyColumn("title"), 
      @UI.Presenter.PropertyColumn("enabled"), 
      @UI.Presenter.StatusColumn, 
      @UI.Presenter.LastModifiedColumn 
    } 
) 
public class Location { 
    private String title; 
    private Boolean enabled; 
} 

为此,我打算用以下注释

public interface UI { 

    @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.TYPE}) 
    public @interface App { 
     public String name(); 
     public Presenter.Column[] columns() default {}; 
    } 

    public interface Presenter { 

     @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.TYPE}) 
     public @interface Column {} 

     @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.TYPE}) 
     public @interface PropertyColumn { 
      public String value(); 
      public boolean editable() default false; 
     } 

     @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.TYPE}) 
     public @interface StatusColumn {} 

     @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.TYPE}) 
     public @interface LastModifiedColumn {} 
    } 
} 

随着注释继承我只想让PropertyColumn,StatusColumn和LastModifiedColumn延长列接口。但是没有接口继承。

这里的主要目标是尽可能简要地概述注释。什么是实现我的目标的最佳方式?

回答

1

这可能是注释仅仅不够灵活来表示复杂结构的情况。虽然没有干净好看,我会考虑使用一个列注释和创建枚举常数为每列类型是这样的:

@Retention(RetentionPolicy.RUNTIME) @Target({ElementType.TYPE}) 
public @interface Column { 
    ColumnType value(); 
    String property() default ""; 
    boolean editable() default false; 
} 

@UI.App(
    name = "locations", 
    columns = { 
      @UI.Presenter.Column(value=ColumnType.PROPERTY, property="title"), 
      @UI.Presenter.Column(value=ColumnType.PROPERTY, property="enabled"), 
      @UI.Presenter.Column(ColumnType.STATUS), 
      @UI.Presenter.Column(ColumnType.LAST_MODIFIED) 
    } 
) 

注意事项是你需要额外的检查和文档,以防止propertyeditable与任何使用列类型。如果您打算使用附加值添加更多列类型,则此方法无效,因为它可能过于复杂。