奇怪的字符串数组声明语法

8
private final String[] okFileExtensions = new String[] { "csv" };

有人能解释一下为什么在字符串数组声明后面要写{}吗?
谢谢。

1
考虑使用枚举而不是显式硬编码文件扩展名。 - Dave Jarvis
4个回答

16

这是一个只包含一个元素的数组,在本例中该元素为String类型的"csv"

当作为声明的一部分时,可以以更简洁的方式编写:

private final String[] okFileExtensions = { "csv" };

多元素数组在值之间用逗号分隔。可以没有任何值。

private final String[] okFileExtensions = { "csv", "tsv" };

private final String[] noFileExtensions = { };

值得注意的是,虽然引用是最终的,但数组不是。因此,您可以这样写:

    okFileExtensions[0] = "exe";

解决这个问题的方法是切换到集合并使用不可修改的实现:

private final Set<String> okFileExtensions = Collections.unmodifiableSet(
    new HashSet<String>(Arrays.asList({
        "csv"
    }));

JDK8旨在增强集合,使其更加简洁。很可能包括语言内的ListSet字面量。也许还会有:

private final Set<String> okFileExtensions = { "csv" };

通常情况下应该优先选择使用集合而不是数组(对于引用类型来说)。


2
如果您想将多个文件扩展名值添加到数组中,只需用逗号分隔它们,例如:private final String[] okFileExtensions = { "csv", "txt", "sql" }; - TabbyCool
我现在已经将其添加到我的答案中。 - Tom Hawtin - tackline
通常情况下,对于引用类型,应该优先使用集合(Collections)而不是数组。但这取决于数组的目的和范围。就像在这里所说的一样,这个说法太过笼统了,我并不太喜欢。 - rsp
+1 提到了JDK7的增强功能。我之前不知道这个,看起来非常有用。 - BalusC

4

这是Java中数组声明的有效语法。

当您在不声明变量的情况下传递数组时,可以使用它:

 public void printArray( String [] someArray ) {
      for( String s : someArray) {
          System.out.println( s );
      }
  }

并像这样调用它:

  printArray( new String [] { "These", "are", "the", "contents"} );

花括号只能在声明数组时使用,因此以下内容不允许:
Stirng [] a;

a = {"on", "two"};

2

创建一个内联的字符串数组。


1

我认为一个更简洁(也不会让人困惑)的声明应该是:

private final String[] okFileExtensions = {"csv"};

1
也许...但是 new <type>[] {...} 语法可以做更多的事情。 - Stephen C

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接