Java 可选<;T>;用于方法的输入参数

Java 可选<;T>;用于方法的输入参数,java,optional,Java,Optional,我已经创建了一个由特定类实现的通用接口。它看起来像: public interface KingdomElementService<T> { public T findById(Long id); public T save(Optional<T> object); public void update(T t); } 到 现在我想知道我使用可选的解决方案在这里是不是有点过头了。你怎么认为?我应该考虑改变它吗?< /P> < P>当你有一个方法,比如

我已经创建了一个由特定类实现的通用接口。它看起来像:

public interface KingdomElementService<T> {

  public T findById(Long id);

  public T save(Optional<T> object);

  public void update(T t);

}


现在我想知道我使用可选的解决方案在这里是不是有点过头了。你怎么认为?我应该考虑改变它吗?< /P> < P>当你有一个方法,比如“代码>保存(可选对象)时,<代码>

我仍然可以打电话
save(空)这就是为什么可选在这里没有意义

您可以在方法中实现一个简单的空检查

void save(T object){
        if(object == null){
            // do smth
        }
    }
或者在方法内部使用可选的.ofNullable()

void save(T object){
    Optional.ofNullable(object)
        .map(..)
    .orElseGet(IllegalAccessError::new);
}

当您有一个类似
save(可选对象)的方法时

我仍然可以打电话
save(空)这就是为什么可选在这里没有意义

您可以在方法中实现一个简单的空检查

void save(T object){
        if(object == null){
            // do smth
        }
    }
或者在方法内部使用可选的.ofNullable()

void save(T object){
    Optional.ofNullable(object)
        .map(..)
    .orElseGet(IllegalAccessError::new);
}

没有针对
Optional
的特定内容,但通过将其用作参数,您将强制所有调用者向此方法传递
Optional
。对此,我宁愿使用
@Nullable
,例如:

public T save(@Nullable T object);
这意味着您将不得不编写
if..else
块(或三元运算符),但在我看来,这样做的复杂性将远远小于强制客户机通过
可选的


此外,您还可以编写(对象)的
Optional.of作为方法实现中的第一行,并将其用于方法代码的其余部分。

对于
Optional
没有任何特定的内容,但将其用作参数,将强制所有调用方将
Optional
传递到此方法。对此,我宁愿使用
@Nullable
,例如:

public T save(@Nullable T object);
这意味着您将不得不编写
if..else
块(或三元运算符),但在我看来,这样做的复杂性将远远小于强制客户机通过
可选的


此外,您还可以编写(对象)的
Optional.of作为方法实现中的第一行,并将其用于方法代码的其余部分。

Java语言架构师都认为Optional应仅用作返回类型。这表示返回类型可以是
null
。所以应该小心

可选
作为输入参数将要求您始终检查参数是否存在,并添加一些检查。如果要添加任何验证,也可以将其放置在不带可选项的位置。将输入参数标记为可选参数时没有额外的值

另外,将参数传递给另一个接受Optional的方法的调用方法必须包装对象并发送。这是一笔开销

我没有考虑边缘案例


编辑:从“Java语言非常清晰”改为更真实的语言。

Java语言架构师们都认为Optional应该只用作返回类型。这表示返回类型可以是
null
。所以应该小心

可选
作为输入参数将要求您始终检查参数是否存在,并添加一些检查。如果要添加任何验证,也可以将其放置在不带可选项的位置。将输入参数标记为可选参数时没有额外的值

另外,将参数传递给另一个接受Optional的方法的调用方法必须包装对象并发送。这是一笔开销

我没有考虑边缘案例


编辑:从“Java语言非常清晰”改为更真实的语言。

如果您有一个
KingdomElementService
的实例,您希望
save
的调用方可以选择是否传递T的实例。因此,考虑到一些变量:

KingdomElementService<T> kes = ... ;
T someT = ... ;
这对打电话的人来说很不方便。相反,您应该修改
kingdomementservice
以提供
save
方法的重载:一个接受arg,一个不接受arg:

interface KingdomElementService<T> {
    T save(T t);
    T save();
}

本质上,
Optional
对想要获取可选参数的API没有帮助。

如果您有一个
kingdomementservice
的实例,您希望
save
的调用方可以选择是否传递一个t实例。因此,考虑到一些变量:

KingdomElementService<T> kes = ... ;
T someT = ... ;
这对打电话的人来说很不方便。相反,您应该修改
kingdomementservice
以提供
save
方法的重载:一个接受arg,一个不接受arg:

interface KingdomElementService<T> {
    T save(T t);
    T save();
}

本质上,
Optional
对想要获取可选参数的API没有帮助。

可选类作为参数没有意义。如何保存不存在的东西?我知道你的意思。正如我所写的,我使用optional的原因与此完全不同。我的对象IRL不可为空。我只是使用optional将4行if语句简化为1行可选语句,这样做是一样的。我认为使用
optional
作为结果更好。不清楚
optional对象在保存上下文中的用途。用更多的信息给出答案可能更容易。可选类作为参数没有意义。如何保存不存在的东西?我知道你的意思。正如我所写的,我使用optional的原因与此完全不同。我的对象IRL不可为空。我只是使用optional将4行if语句简化为1行可选语句,这样做是一样的。我认为使用
optional
作为结果更好。不清楚
optional对象在保存上下文中的用途。如果能提供更多相关信息,回答可能会更容易。“文档中的内容非常清楚”,请提供一个指向具体文档的链接,其中说明了这一点。这种语言甚至不适合我