2011-07-10 43 views
0

我正在研究一个工具,用户可以使用他们自己的注释来描述数据处理工作流程(如验证,转换等)。API设计:一个通用接口VS三个专用接口?

除了使用现成的使用注释,用户可以用户自己:为了做到这一点,他们需要声明注释类本身,然后实现注解处理器(< --IT是这个问题的要点actualy) 。

用于数据处理的配置的方法可以是这样的一种:

void foo(@Provide("dataId") @Validate(Validator.class) String str) {  
    doSmth(str); 
} 

有很自然三组注解:

  1. 那些产生的初始值;
  2. 转换值(转换器);
  3. 那些只读取值和执行一些工作(验证者,不同的消费者)的人。

所以我需要做的choise:可以创建一个接口,用于处理所有这些类型的注解,它可以象这样:

interface GenericAnnotationProcessor {  
    Object processAnnotation(Annotation annotation, Object processedValue); 
} 

或者,我可以添加3个intefaces的API:

interface ProducerAnnotationProcessor {  
    Object produceInitValue(Annotation annotation); 
} 

interface TransformerAnnotationProcessor {   
    Object transformValue(Annotation annotation, Object currentValue); 
} 

interface ConsumerAnnotationProcessor { 
    void consumeValue(Annotation annotation, Object currentValue); 
} 

第一个选项在使用中不是很明确,但第三个选项使用3个几乎相似的接口污染API。

你会选择什么(首先作为API用户),为什么?

谢谢!

回答

0

我会创建第一个更一般的接口,然后定义三个不同的实现类。在不了解你将如何使用它的情况下,我的第一本能是定义接口和/或基类(取决于在不同处理器之间共享多少通用实现代码),然后在派生中添加专门的处理器实现类型,所有这些共享通用接口。

在使用API​​时,我希望声明一个实现GenericAnnotationProcessor的变量,然后根据我的需要分配相应的实现类型。

现在在俄勒冈州波特兰的早期,但在此刻,我需要的咖啡因水平的50%,这在我看来似乎会提供最大的灵活性,同时最大限度地提高咖啡因的再利用率。

当然,你的实际需求可能会另有规定。 。 。

希望有帮助!

0

只是潜入你的问题。

由于他们正在执行类似的任务,有一些差异,Strategy pattern #Example应该会帮助你。

你的问题应该看起来像下面的东西。现在

interface GenericAnnotationProcessor {  
    Object processAnnotation(Annotation annotation, Object processedValue); 
} 

interface ProducerAnnotationProcessor implements GenericAnnotationProcessor { 
} 

interface TransformerAnnotationProcessor implements GenericAnnotationProcessor { 
} 

interface ConsumerAnnotationProcessor implements GenericAnnotationProcessor { 
} 

你可以从维基

class Context { 

    // map of annotation processors 

    // register(add/remove) annotation processors to the map 

    public int executeAnnotationProcessor(Annotation annotation, Object processedValue) { 
     return locateAnnotationProcessor(annotation).processAnnotation(annotation, processedValue); 
    } 

    private GenericAnnotationProcessor locateAnnotationProcessor(Annotation annotation) { 
     // return expected annotation processor 
    } 
} 

遵循的例子,我相信你能理解。

0

您可以使用接口扩展接口More on there

到类类似,您可以用建立的接口继承层次extends关键字,如:

interface Washable { 
    void wash(); 
} 

interface Soakable extends Washable { 
    void soak(); 
} 

在这个例子中,接口可浸入式扩展接口可水洗。因此,Soakable继承了Washable的所有成员。实现Soakable的类必须为Soakable,wash()和soak()声明或继承的所有方法提供主体,或者声明为抽象主体。请注意,只有接口可以“扩展”其他接口。类不能扩展接口,它们只能实现接口。

希望它有帮助。