Java,当返回并使用;空";比可选的好?

Java,当返回并使用;空";比可选的好?,java,optional,Java,Optional,我是java新手,以前使用过php、python和js。最近使用python,所以要习惯类似“IfMyVar为None:”。这里是我的问题:我从一些库中获取区域设置作为可选的,我只需要返回一种语言,或者如果发生超时,或者一些错误,等等。然后我需要将语言传递给某个对象(上下文),然后在稍后的某处将上下文转换为请求的参数。所以我做了一些类似的事情 String getLanguage(){ try { Optional<String> locale = getLocale()

我是java新手,以前使用过php、python和js。最近使用python,所以要习惯类似“IfMyVar为None:”。这里是我的问题:我从一些库中获取区域设置作为可选的,我只需要返回一种语言,或者如果发生超时,或者一些错误,等等。然后我需要将语言传递给某个对象(上下文),然后在稍后的某处将上下文转换为请求的参数。所以我做了一些类似的事情

String getLanguage(){
  try {
    Optional<String> locale = getLocale();
    if (locale.isPresent()){logging, locale.get()-to-language conversion, language validation, 
      logging, return language} 
    else (logging, return null;)
  } except {logging error, return null};
}

Context c = new Context();
c.setSomething(something);
c.setLanguage(getLanguage());

and somewhere later:
Request r = new Request();
r.addParam(something, c.getSomething());
if (c.getLanguage() != null) {r.addParam(language, c.getLanguage())
String getLanguage(){
试一试{
可选区域设置=getLocale();
if(locale.isPresent()){logging,locale.get()-到语言转换,语言验证,
日志记录,返回语言}
else(日志记录,返回null;)
}除了{记录错误,返回null};
}
上下文c=新上下文();
c、 设置某物(某物);
c、 setLanguage(getLanguage());
后来的某个地方:
请求r=新请求();
r、 addParam(something,c.getSomething());
如果(c.getLanguage()!=null){r.addParam(language,c.getLanguage())
我有一个建议,用Optional重写所有内容。用类似的方法替换我的第一个方法

Optional<String> getLanguage(){
  try {
    Optional<String> locale = getLocale();
    return locale.ifPresent(logging)
          .map(locale-to-language conversion, language validation, logging, return language}
          .orElse(logging, return Optional.isEmpty())
  } except {logging error, return Optional.isEmpty()};
}

and then somewhere later c.getLanguage().ifPresent(x -> r.addParam(language, x))
可选的getLanguage(){
试一试{
可选区域设置=getLocale();
返回locale.ifPresent(日志记录)
.map(区域设置到语言转换、语言验证、日志记录、返回语言}
.orElse(日志记录,返回可选的.isEmpty())
}除了{记录错误,返回可选的.isEmpty()};
}
然后在稍后的某个地方c.getLanguage().ifPresent(x->r.addParam(language,x))
我以前从未使用过Optional,所以我很高兴能学到一些新东西,我认为对于习惯了Optional的人来说,我的代码并不好。从另一方面看,我发现这里的Optional有些过火——我需要修改我的数据类上下文来处理Optional、my map()和orElse()它们很难看——它们有2-5行代码,等等。单元测试也需要返工。所以,我的问题是——这些对可选的更改是否增加了一些好处,或者我们只是在不假思索地追随潮流

所以,我的问题是-这些对可选的更改是否增加了一些好处

这两种方法肯定都有优点和缺点:

可选
方面看,主要的“优点”是消除了一个主要的bug源;即NPE是由于没有正确处理可能返回的
null
而导致的。主要的“缺点”是使用
Optional
的代码的冗长程度,并且它实际上并没有消除所有bug;例如,如果您调用
Optional.get
的“空”
Optional
,您将得到一个异常

其他问答更详细:

…或者我们只是不假思索地追随时尚

那是另一个问题

现在我想有些人可能会不假思索地使用
可选的
,但我看不到太多的证据。很明显,它有优点和缺点,这是需要思考的


所以你应该问(你自己!)如果>>你我会说当你的代码知道如何处理空的情况时,可选是好的

 public String helloWorld(Optional<Long> input){
     String toReturn = "Hello "+ input.orElse("0")+ " times";
     return toReturn;
 }

在上面的例子中,Optional只会使用null。在这种情况下,我会使用null而不是Optional。

使用您认为在特定上下文中最合适的内容……除此之外,只需尝试移动
map之类的内容(语言环境到语言的转换、语言验证、日志记录、将语言}
返回到它们自己的方法。此代码甚至不可编译。请首先提供一个最小且可复制的示例:@Naman,已经执行了。那些“语言环境到语言的转换”和“语言验证”已经是方法了,而且我的日志记录使用了一些其他局部变量,所以如果我要将这些东西移动到一个新的方法,我需要3个额外的参数来记录。方法看起来不太好。@RavindraRanwala这是一个表示想法的伪代码,而不是真正的代码。虽然总体来说这是一个很好的答案,但我不同意
主“plus”就是你消除了一个主要的bug来源,即NPE的
,如果你没有正确地检查一个
可选的
,它会抛出
NoTouchElementException
。这不是对NPE的改进。我称之为“假功能”更好?我想你的解释很清楚,但我不确定这是什么原因。这个想法是这样的:如果你将返回的
null
传递给另一个方法或类,而该类抛出NPE,NPE实际上并不指向导致问题的代码。
Optional
应该为对接收者进行测试。但我仍然觉得这没有足够的价值使额外的复杂性变得值得。这是一个意见问题。我不会以这样或那样的方式对意见进行判断。如果你认为这很重要,那么你应该写自己的答案。
if(someOptional.isPresent()){
       return somevalue;
} else{
       return null;
 }