关于第一个问题:
由于 Facet 只有可选字段,所以 A 类中必须有 @NotNull 吗?
考虑一个咖啡馆的场所设置。每个顾客都应该有一个咖啡杯作为设置的一部分,即使那个咖啡杯是空的。咖啡是可选的,但杯子是必需的。当顾客在那种环境下坐下时,空咖啡杯和没有杯子的区别很大。
所以杯子必须是非空的。但是杯子的内容,咖啡,是可选的,允许为空。
class PlaceSetting {
@NotNull
private CoffeeCup coffeeCup; // A cup is required for every setting.
}
class CoffeeCup {
String coffee; // Optional, null allowed, for an empty coffee cup.
}
关于你的第二个问题:
如何使用注释来表示,使得 CR(或)品牌、范围字段都是必需的?如果 CR 不存在品牌,范围应该在那里。
不,Java 中没有这样的功能。
但这种情况可能是“代码异味”,表明可能存在设计缺陷。如果您的逻辑允许一个“CR”或一对“品牌”和“范围”,那么这意味着 CR 和品牌/范围是可替代的。所以也许它们代表一件事的两种变体。如果是这样,那么很可能一个接口是合理的,它表示一个事物的更高层次的抽象,两个具体类中的任何一个都实现了该接口。
继续我们的咖啡馆示例,我们可以将“饮料容器”定义为我们的抽象。我们的具体实现是“水杯”或“带碟的咖啡杯”。
class PlaceSetting {
@NotNull
private BeverageContainer bevCon; // Either a water glass or coffee cup is required for every place setting.
}
interface BeverageContainer {}
class WaterGlass implements BeverageContainer {
Water water ; // Optional, may be null.
}
class CupAndSaucer implements BeverageContainer {
@NotNull
CoffeeCup CoffeeCup ;
@NotNull
Saucer saucer ;
}
class CoffeeCup {
String coffee; // Optional, null allowed, for an empty coffee cup.
}
class Saucer { … }