Optional Java 8中引入的类型对于许多开发人员来说是一件新事物.
一个getter方法返回Optional<Foo>类型代替经典的Foo一个好习惯吗?假设值可以null.
现在已经使用Java 8超过6个月左右,我对新的API更改感到非常满意.我仍然不自信的一个领域是什么时候使用Optional.我似乎想要在任何可能的null地方使用它,而且无处可去.
似乎有很多情况我可以使用它,我不知道它是否增加了好处(可读性/无效安全性)或只是导致额外的开销.
所以,我有一些例子,我对社区是否Optional有益的想法感兴趣.
1 - 当方法可以返回时作为公共方法返回类型null:
public Optional<Foo> findFoo(String id);
Run Code Online (Sandbox Code Playgroud)
2 - 当参数可能是null以下时作为方法参数:
public Foo doSomething(String id, Optional<Bar> barOptional);
Run Code Online (Sandbox Code Playgroud)
3 - 作为bean的可选成员:
public class Book {
private List<Pages> pages;
private Optional<Index> index;
}
Run Code Online (Sandbox Code Playgroud)
4 - 在Collections:
一般来说,我不认为:
List<Optional<Foo>>
Run Code Online (Sandbox Code Playgroud)
添加任何东西 - 特别是因为可以使用filter()删除null值等,但是Optional在集合中是否有任何好的用途?
我错过了什么案例?
Enum类是Serializable,因此使用枚举序列化对象没有问题.另一种情况是class具有java.util.Optional类的字段.在这种情况下,抛出以下异常:java.io.NotSerializableException:java.util.Optional
如何处理这些类,如何序列化它们?是否可以将此类对象发送到远程EJB或通过RMI?
这是一个例子:
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.Optional;
import org.junit.Test;
public class SerializationTest {
static class My implements Serializable {
private static final long serialVersionUID = 1L;
Optional<Integer> value = Optional.empty();
public void setValue(Integer i) {
this.i = Optional.of(i);
}
public Optional<Integer> getValue() {
return value;
}
}
//java.io.NotSerializableException is thrown
@Test
public void serialize() {
My my = new My();
byte[] bytes = toBytes(my);
}
public static <T extends Serializable> byte[] toBytes(T reportInfo) { …Run Code Online (Sandbox Code Playgroud) 构造函数也可以像任何其他方法一样重载,我知道这个事实.由于任务,我决定使用具有多个构造函数的抽象超类:
摘要超类:
protected ListSortierer()
{
this( null, null );
}
protected ListSortierer( List<E> li )
{
this( li, null );
}
protected ListSortierer( Comparator<E> comp )
{
this( null, comp );
}
protected ListSortierer( List<E> li, Comparator<E> com )
{
this.original = Optional.ofNullable( li );
this.comp = Optional.ofNullable( com );
}
Run Code Online (Sandbox Code Playgroud)
要访问每个构造函数,我还需要子类中的多个构造函数.
BubbleSort.java:
public ListBubbleSort()
{
super();
}
public ListBubbleSort( List<E> li )
{
super( li );
}
public ListBubbleSort( Comparator<E> com )
{
super( com );
}
public ListBubbleSort( …Run Code Online (Sandbox Code Playgroud) 最近我和我的队友讨论了Guava Optional在方法中使用可选参数的问题.
我们说方法是
List<Book> getBooks(String catalogId, Optional<String> categoryId) {
Validate.notNull(catalogId);
Validate.notNull(categoryId); // Point of conflict. Is this required?
Run Code Online (Sandbox Code Playgroud)
它接受一个catalogId和一个可选项 categoryId,它返回该目录中列出的书籍,如果类别也被传递,则只返回该类别中的书籍.
冲突点是,验证Optional<String> categoryId空检查.我认为不应该对它进行空检查,因为它是一个可选参数.该函数的调用者可以传递null或Optional.<String>absent()与getBooks功能应做处理这两种情况if(categoryId==null && categoryId.isPresent())在执行.
我的意见是,Optional对于可选参数,只是使方法的合同更加清晰.通过查看方法签名,可以告诉该参数是可选的,并且不需要读取javadoc.但是Optional.absent()当他不想使用那个可选参数时,他不应该被迫通过.
我的队友有不同的看法.他想对它进行空检查,因此强制调用者总是通过Optional.<String>absent().他的观点是我们为什么要传递null可选.而且getBooks("catalog123", Optional.absent())看起来更可读getBooks("catalog123", null).
此方法位于我们的一个库包中,由我们拥有的多个包使用.
您Optional对此方案的使用有何建议?
谢谢
给定一个非常简单的类:
class MyClass {
int id;
double value;
MyClass(int id) {
this.id = id;
}
void setValue(double v) {
value = v;
}
boolean isValueUnassigned() {
return value == 0;
}
}
Run Code Online (Sandbox Code Playgroud)
要检查是否value尚未分配,return value == 0;因为a double是0默认设置,我可以这样做吗?
这是来自另一个StackOverflow问题的代码段:
@Override
public String convertToDatabaseColumn(final UUID entityValue) {
return ofNullable(entityValue).map(entityUuid -> entityUuid.toString()).orElse(null);
}
Run Code Online (Sandbox Code Playgroud)
我真的很难理解Optional类的使用.返回代码是"返回映射的值(String),还是NULL,如果失败?
如何返回作用于方法而不是类 - 即Optional.ofNullable()?
我有一堂这样的课
class User {
private String firstName;
private String lastName;
...
}
Run Code Online (Sandbox Code Playgroud)
我希望该lastName属性是可选的。我如何在 Java 中实现这一点?
在某些语言中,它非常优雅和简单,我们只需在字段名称后面添加一个问号即可。
java ×8
java-8 ×3
optional ×3
constructor ×1
guava ×1
inheritance ×1
instance ×1
nullable ×1
option-type ×1
primitive ×1
superclass ×1