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对象在保存上下文中的用途。如果能提供更多相关信息,回答可能会更容易。“文档中的内容非常清楚”,请提供一个指向具体文档的链接,其中说明了这一点。这种语言甚至不适合我