相关疑难解决方法(0)

Java 8 getter应该返回可选类型吗?

Optional Java 8中引入的类型对于许多开发人员来说是一件新事物.

一个getter方法返回Optional<Foo>类型代替经典的Foo一个好习惯吗?假设值可以null.

java nullable optional java-8

267
推荐指数
4
解决办法
5万
查看次数

用于可选

现在已经使用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在集合中是否有任何好的用途?

我错过了什么案例?

java optional java-8

242
推荐指数
7
解决办法
8万
查看次数

为什么java.util.Optional不是Serializable,如何使用这些字段序列化对象

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)

java serialization optional java-8

101
推荐指数
4
解决办法
3万
查看次数

构造函数重载 - Java中的最佳实践

构造函数也可以像任何其他方法一样重载,我知道这个事实.由于任务,我决定使用具有多个构造函数的抽象超类:

摘要超类:

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)

java inheritance constructor instance superclass

17
推荐指数
2
解决办法
1669
查看次数

Guava可选作为可选参数的方法参数

最近我和我的队友讨论了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空检查.我认为不应该对它进行空检查,因为它是一个可选参数.该函数的调用者可以传递nullOptional.<String>absent()getBooks功能应做处理这两种情况if(categoryId==null && categoryId.isPresent())在执行.

我的意见是,Optional对于可选参数,只是使方法的合同更加清晰.通过查看方法签名,可以告诉该参数是可选的,并且不需要读取javadoc.但是Optional.absent()当他不想使用那个可选参数时,他不应该被迫通过.

我的队友有不同的看法.他想对它进行空检查,因此强制调用者总是通过Optional.<String>absent().他的观点是我们为什么要传递null可选.而且getBooks("catalog123", Optional.absent())看起来更可读getBooks("catalog123", null).

此方法位于我们的一个库包中,由我们拥有的多个包使用.

Optional对此方案的使用有何建议?

谢谢

java optional-parameters guava

3
推荐指数
1
解决办法
2144
查看次数

检查是否已设置原语

给定一个非常简单的类:

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 double0默认设置,我可以这样做吗?

java primitive

2
推荐指数
2
解决办法
87
查看次数

如何解释和使用Java 1.8 Optional Class

这是来自另一个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()?

java

1
推荐指数
1
解决办法
196
查看次数

如何将字段设为可选?

我有一堂这样的课

class User {
  private String firstName;
  private String lastName;

  ...
}
Run Code Online (Sandbox Code Playgroud)

我希望该lastName属性是可选的。我如何在 Java 中实现这一点?

在某些语言中,它非常优雅和简单,我们只需在字段名称后面添加一个问号即可。

java option-type

1
推荐指数
1
解决办法
7834
查看次数