gpt4 book ai didi

java - 具有包私有(private)构造函数的类和通过 Guice 实例化的相应对象的积极副作用?

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:49:42 24 4
gpt4 key购买 nike

想知道这是否是 Guice 实例化对象的包私有(private)构造函数的副作用。

我有一个类看起来像

class Foo { //note the access specifier

private Bar1 iCannotBeNull;
private Bar2 iCannotBeNullEither;

@Inject
Foo(Bar1 bar1, Bar2 bar2) {//note the access specifier
this.iCannotBeNull = Objects.requireNonNull(bar1, "null injected");
this.iCannotBeNullEither = Objects.requireNonNull(bar2, "null injected");
}

}

经过 https://github.com/google/guice/wiki/UseNullable ,看起来我可以在技术上摆脱 null 检查,因为我通过包私有(private)构造函数(当然还有位于同一包中的 Guice 模块)确保 Foo 的对象仅由 Guice 创建,而 Guice 永远不会注入(inject) null。

@Inject
Foo(Bar1 bar1, Bar2 bar2) {//note the access specifier
this.iCannotBeNull = bar1;
this.iCannotBeNullEither = bar2;
}

我的理解是否正确,还是我忽略了这里非常明显的东西?

最佳答案

Google 的敏捷教练 Miško Hevery 声称这些 checkNotNull 断言在 this blog 中略微抑制了测试。 .

例如,对于测试不关心的依赖项,传递 null 通常很有用:

testSecureHouse() {
Door door = new Door();
Window window = new Window();
House house = new House(door, window,
null, null, null, null);

house.secure();

assertTrue(door.isLocked());
assertTrue(window.isClosed());
}

如果您订阅此 View ,checkNotNull 的替代方法是使用@Nullable@NonNull@ ParametersAreNonnullByDefault 注释:

@Inject
Foo(@NonNull Bar1 bar1, @NonNull Bar2 bar2) {
//
}

如果您这样做,当开发人员试图将 null 传递给 Foo 的构造函数时,大多数 IDE 或 lint 检查都会发出警告。

不过,总的来说,您似乎必须通过传递 null 来平衡便利性和开发人员犯错的风险。由于您已经很好地组织了您的包,并且正在使用访问修饰符来防止意外使用,因此您的特定情况(包私有(private)构造函数,只会由 Guice 模块调用)的风险似乎很低。

如果您的 Foo 类是公共(public) API 的一部分,情况就会大不相同,并且该类肯定会从断言和快速失败中受益。

关于java - 具有包私有(private)构造函数的类和通过 Guice 实例化的相应对象的积极副作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45723580/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com