【问题标题】:@NotNull at Object level but the fields are optional@NotNull 在对象级别,但字段是可选的
【发布时间】:2022-01-12 05:23:57
【问题描述】:

我在父对象中设置了@NotNull。但是该对象的字段是可选的。 例如:

class A {
    @NotNull
    private Facet fc;
}

class Facet {
  String CR;
  String brand;
  String range;
}

问题是:

  1. 由于 Facet 只有可选字段,所以 A 类中是否必须有 @NotNull?
  2. 如何使用注释来表示,这样 CR(或)品牌、范围字段都是必需的?如果 CR 不存在品牌,范围应该在那里。

对此的任何建议都会有所帮助。

【问题讨论】:

    标签: java validation entity notnull


    【解决方案1】:

    关于第一个问题:

    由于 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 { … }
    

    【讨论】:

      猜你喜欢
      • 2021-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-02
      • 1970-01-01
      • 2016-09-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多