JavaBean的缺点——构造过程中不一致

Bat*_*tty 5 java effective-java

有效的 Java - Item-2 指出

JavaBean 在其构造过程中可能会处于不一致的状态。

我无法理解这一点,如果在方法中构造一个对象,那么它会如何不一致,如果必须发生异常,那么也可能在构造函数中发生。这与线程有何关系?

Maa*_*wes 4

书中介绍了以下 Bean:

NutritionFacts cocaCola = new NutritionFacts();
cocaCola.setServingSize(240);
cocaCola.setServings(8);
cocaCola.setCalories(100);
cocaCola.setSodium(35);
cocaCola.setCarbohydrate(27);
Run Code Online (Sandbox Code Playgroud)

其中,servingSizeservings设定的setServingSize(int)setServings(int)是营养成分的基础(至少在本书中如此)。

但如果你只是打电话:

NutritionFacts cocaCola = new NutritionFacts();
cocaCola.setServingSize(240);
cocaCola.setCalories(100);
Run Code Online (Sandbox Code Playgroud)

那么该servings字段将不会被设置。因此,生成的实例现在处于无效状态。

因此,如果您调用一个需要有效实例的方法,那么healthRiskCalculator.calculateHealthRisk(NutritionFacts facts)您将在对象内或在healthRiskCalculator.

因此,现在您可以在调用时检查对健康的损害calculateHealthRisk(),但可能有许多方法读取或使用对象实例。此外,您可能还为其他产品创建了大量无效实例。换句话说,这并不是快速失败

因此,不存在使用 bean 创建构造对象的万无一失的方法。这并不是线程特有的,您可以在单个线程中创建无效的 bean 实例。