Java 无法从字符串数组创建集合

Java 无法从字符串数组创建集合,java,Java,我盯着屏幕看了5分钟,似乎不知道我做错了什么: class Example { private final Set<String> values; public Example(String... values) { values = new HashSet<String>(Arrays.asList(values)); } } 我的作业怎么了?您缺少实际访问专用字段的资格。当前您正在尝试重新分配传递给构造函数的参数。相反,您

我盯着屏幕看了5分钟,似乎不知道我做错了什么:

class Example {

    private final Set<String> values;

    public Example(String... values) {
        values = new HashSet<String>(Arrays.asList(values));
    }
}

我的作业怎么了?

您缺少实际访问专用字段的资格。当前您正在尝试重新分配传递给构造函数的参数。相反,您应该使用以下代码:

public Example(String... values) {
     this.values = new HashSet<String>(Arrays.asList(values));
}
公共示例(字符串…值){
this.values=newhashset(Arrays.asList(values));
}
通过使用“菱形操作符”(自Java 7:

public Example(String... values) {
     this.values = new HashSet<>(Arrays.asList(values));
}
公共示例(字符串…值){
this.values=newhashset(Arrays.asList(values));
}

这就是你可以做到的

 if(values != null)
      this.values = new HashSet<>(Arrays.asList(values));
 else
      this.values = Collections.emptySet();
if(值!=null)
this.values=newhashset(Arrays.asList(values));
其他的
this.values=Collections.emptySet();

在赋值之前添加if(values!=null)检查。无论何时使用var args,您都将公开一个协定,该协定将允许您的客户端创建一个有效的示例对象,而无需任何参数。如果要避免这种情况发生,请使用String[]直接使用值,如果为空则引发异常。在构造函数中使用此值代替值,因为构造函数的参数是字符串数组,并且您正在尝试将列表转换为数组


this.values=..

其他答案已经解决了问题的原因,但是简单地重命名参数以避免阴影不是更好吗?

构造函数中的
values
参数正在阴影类字段
values
。正如@ajp15243所说。您可以通过分配给
this.values
,或更改构造函数参数的名称来修复它。@AbhijeetKushe回答得很好正确的答案已经给出了,所以我想我将给出一个comment@AbhijeetKushe你说得很好我肯定会投你一票,但这取决于你我不明白你怎么会在这么糟糕的前提下得出正确的结果。。。你的逻辑是。。。abysmal@Vogel612也许这个答案的表述有点混乱,但结论似乎是完全正确的。。。谢谢你,沃格尔!你说得对,我应该验证我的输入,很好。实际上,我认为抛出
IllegalArgumentException
可能最适合
null
arg。是的,如果使用Sting[]值作为参数,IllegalArgumentException将是理想的选择。我一开始就不会遇到这种情况。
 if(values != null)
      this.values = new HashSet<>(Arrays.asList(values));
 else
      this.values = Collections.emptySet();