2017-10-20 46 views
0

我有一个自定义限定符,它需要参数 - 枚举值。枚举值包含特定于所需实例构造的信息。将限定符传递给提供者方法

如果我到增加新的价值,枚举它会导致相同的样板代码模块中,像这样:

预选赛(JAVA):

@Documented 
@Qualifier 
@Retention(RUNTIME) 
public @interface Format { 
Type value() default SYSTEM; 

enum Type { 
    UI("dd-MM-yyyy HH:mm"), 
    UI_DATE("EEEE,\u00A0dd MMMM yyyy"), 
    . 
    . 
    . 

    private String format; 

    public String getFormat() { 
     return format; 
    } 

    Type(String formatString) { 
     format = formatString; 
    } 
} 
} 

模块(科特林):

@Module 
class DateTimeModule { 

@Provides 
@Format(Format.Type.UI) 
fun dateTimeFormatterUI(): DateTimeFormatter { 
    return DateTimeFormat.forPattern(Format.Type.UI.format).withLocale(DefaultConfigVariables.LOCALE) 
} 

@Provides 
@Format(Format.Type.UI_DATE) 
fun dateFormatterUI(): DateTimeFormatter { 
    return DateTimeFormat.forPattern(Format.Type.UI_DATE.format).withLocale(DefaultConfigVariables.LOCALE) 
} 

. 
. 
. 

} 

是否有可能以某种方式改变它,我只能添加一个新的实例枚举,它被传递给提供者方法或类似的东西?

回答

1

不通过匕首。除非您将一个模块编入Dagger,否则将无法以编程方式读取您的注释并根据这些值采取不同的操作。

务实,虽然它弯曲迪米特法则,我会做这种方式:

public class DateTimeFormatterFactory { 
    @Inject DateTimeFormatterFactory() {} 

    public DateTimeFormatter forFormat(Format.Type type) { 
    return DateTimeFormat 
     .forPattern(type) 
     .withLocale(DefaultConfigVariables.LOCALE); 
    } 
}