【发布时间】:2014-08-30 22:53:32
【问题描述】:
我正在学习 Guice 的依赖注入。我试图了解在使用依赖注入框架进行编程时是否有推荐的方法来实现静态类常量。
Huracan 类第一版:
public class Huracan implements Car {
public static final URL COMPANY_URL;
public static final String CAR_TYPE = "sports car";
static {
try {
COMPANY_URL = new URL("www.lamborghini.com");
} catch (MalformedURLException e) {
e.printStackTrace();
throw new Error(e);
}
}
public void drive() {
System.out.println("Lamborghini Huracan " + CAR_TYPE + " driving!" );
}
}
我可以创建一个模块 - HuracanModule - 在那里我可以使用 bindConstant 和 bind toInstance 进行绑定,并从 Huracan 类中删除静态常量声明。
Guice Huracan 模块:
public class HuracanModule extends AbstractModule {
@Override
protected void configure() {
bindConstant().annotatedWith(Names.named("cars.huracan.cartype")).to("sports car");
bind(URL.class).annotatedWith(Names.named("cars.huracan.company_url")).
toInstance(new URL("www.lamborghini.com"));
}
}
Huracan 类第二版:
public class Huracan implements Car {
private final String CAR_TYPE;
private final URL COMPANY_URL;
public Huracan( @Named("cars.huracan.cartype") String carType,
@Named("cars.huracan.comany_url") URL companyUrl ) {
this.CAR_TYPE = carType;
this.COMPANY_URL = companyUrl;
}
public void drive() {
System.out.println("Lamborghini Huracan " + CAR_TYPE + " driving!" );
}
}
我了解这使您可以灵活地在不同场景中操作常量。但我觉得我错过了一些东西。
- 这是正确的编程模型吗?是否假设您要存储静态常量的每个类都有一个 Guice 模型?还是只为所有内容创建一个巨大的主应用程序模块?模块和类之间的语义相关性是什么?
通过在类上使用静态常量声明,知道如何唯一地引用它们的负担由编程语言本身处理。前任。 Huracan.CAR_TYPE。通过依赖注入,我发现注释需要是唯一的。前任。 @Named("cars.huracan.cartype")。如果模块要与其他模块组合以创建主应用程序模块,它还需要在全局范围内是唯一的。所以最后我发现自己给出了我放在注释中的字符串,或者我创建的自定义注释的名称,与 CLASS.FIELD 结构的含义相同。
- 正确吗?但是后来我失去了编程语言的“命名空间”功能,我必须手动确保每个字符串键或注释名称在全球范围内都是唯一的。
对此事的任何想法将不胜感激。
【问题讨论】:
标签: java dependency-injection static constants guice