是否可以使用Java Optional记录返回值不为null?

是否可以使用Java Optional记录返回值不为null?,java,optional,non-nullable,Java,Optional,Non Nullable,是否可以用JavaOptional记录返回值不是null 只关心参数,但我想用类型表示返回值不是null(而不是在JavaDoc中这样做) 更新查找行如果您希望表示可能的null对象,并且当对象绝对不为null时,您可以与团队商定使用可选作为返回值: public Optional<Job> getJob() { ... } public Job extractJob(NonNullJobHolder<Job> holder) { ... } public可选getJ

是否可以用Java
Optional
记录返回值不是
null

只关心参数,但我想用类型表示返回值不是
null
(而不是在JavaDoc中这样做)

更新查找行如果您希望表示可能的
null
对象,并且当对象绝对不为null时,您可以与团队商定使用
可选
作为返回值:

public Optional<Job> getJob() {  ... }
public Job extractJob(NonNullJobHolder<Job> holder) { ... }
public可选getJob(){…}
公共作业提取作业(非空作业持有者){…}
您可以使用.OrElse()。看这个例子

Optional<String> response = Optional.of("Not Null");
    Optional<String> response2 = Optional.empty();
    System.out.println(response.orElse(""));
    System.out.println(response2.orElse("Dont want to return null"));
Optional response=Optional.of(“非空”);
Optional response2=Optional.empty();
System.out.println(response.orElse(“”);
System.out.println(response2.orElse(“不想返回null”);

我不知道为什么您会有这样的印象:它们中的大多数只适用于参数

org.eclipse.jdt.annotation.NonNull

@Documented
@Retention(value=CLASS)
@Target(value={FIELD,METHOD,PARAMETER,LOCAL_VARIABLE})
public @interface NonNull
@Target(value={METHOD,FIELD,ANNOTATION_TYPE,CONSTRUCTOR,PARAMETER})
@Retention(value=RUNTIME)
@Documented
@Constraint(validatedBy={})
public @interface NotNull
@Documented
@TypeQualifier
@Retention(value=RUNTIME)
public @interface Nonnull
org.jetbrains.annotations.NotNull

@Documented
@Retention(value=CLASS)
@Target(value={FIELD,METHOD,PARAMETER,LOCAL_VARIABLE})
public @interface NonNull
@Target(value={METHOD,FIELD,ANNOTATION_TYPE,CONSTRUCTOR,PARAMETER})
@Retention(value=RUNTIME)
@Documented
@Constraint(validatedBy={})
public @interface NotNull
@Documented
@TypeQualifier
@Retention(value=RUNTIME)
public @interface Nonnull
@NotNull注释实际上是一个显式的契约声明 即:

  • 方法不应返回null
  • 变量(字段、局部变量和参数)不能包含空值
用法:

javax.validation.constraints.NotNull

@Documented
@Retention(value=CLASS)
@Target(value={FIELD,METHOD,PARAMETER,LOCAL_VARIABLE})
public @interface NonNull
@Target(value={METHOD,FIELD,ANNOTATION_TYPE,CONSTRUCTOR,PARAMETER})
@Retention(value=RUNTIME)
@Documented
@Constraint(validatedBy={})
public @interface NotNull
@Documented
@TypeQualifier
@Retention(value=RUNTIME)
public @interface Nonnull
javax.annotation.Nonnull

@Documented
@Retention(value=CLASS)
@Target(value={FIELD,METHOD,PARAMETER,LOCAL_VARIABLE})
public @interface NonNull
@Target(value={METHOD,FIELD,ANNOTATION_TYPE,CONSTRUCTOR,PARAMETER})
@Retention(value=RUNTIME)
@Documented
@Constraint(validatedBy={})
public @interface NotNull
@Documented
@TypeQualifier
@Retention(value=RUNTIME)
public @interface Nonnull
用法:



因此,您可以在方法中随意使用这四个选项中的任何一个。

如果您返回可选,那么您就不应该返回null,不需要文档。中有禁止
null
选项。是否有Optional的子类本身表示容器有值?或者,由于泛型的类型擦除,无法使用子类型?听起来您只需要。。。阅读可选文档并尝试使用可选文档。您似乎是在一些非常严重的误解下操作的,文档已经足够好了,可以帮您解决这些误解;这应该是暗示。实际上可以返回null的方法需要显式地记录为这样做。(是否应该使用Optional来实现这一点取决于方法和设计;请参阅以获得权威答案。)仅添加javax.annotation.Nonnull、edu.umd.cs.findbugs.annotations.Nonnull,lombok开发人员似乎拒绝添加对非null返回值的检查:@rkosegi umd文档在sourceforge上,我的公司阻止了它。如果您能添加适当的文档,我将不胜感激。哇!似乎不可能在Java类型中表示非null返回值。Java类型的系统不够智能。唯一的方法是使用静态代码分析工具。@gavenkoa正是这样。听起来你想要科特林。