/ / Matriz não nula bidimensional de elementos anuláveis ​​- java, java-8, anotações, anulável, anotação de tipo

Matriz bidimensional não nula de elementos anuláveis ​​- java, java-8, anotações, anuláveis, anotação de tipo

No Java 8, onde devo colocar o @Nullable/@NonNull anotações de tipo para declarar uma dimensão bidimensional nãonull matriz de anulável elementos?

Ao declarar um tipo (como na assinatura do método), ambos

@Nullable Object @NonNull[][]

e

@Nullable Object @NonNull[]@NonNull[]

são sintaticamente válidos.

Da mesma forma, ao definir um valor (uma matriz de comprimento zero), posso usar

new @Nullable Object @NonNull[0][]

ou

new @Nullable Object @NonNull[0]@NonNull[]

Qual versão está correta?

Respostas:

5 para resposta № 1

Ao ler um tipo de matriz, você começa entre colchetes e avança, depois lê o tipo de elemento por último. Por exemplo, Object[][] é pronunciado como "matriz de matriz de objeto". Isso ajuda a entender que o primeiro par de colchetes indica a matriz mais externa e o próximo par de colchetes indica todas as matrizes que são elementos da matriz mais externa.

Você coloca uma anotação de tipo imediatamente antes do tipo correspondente.

Aqui está um exemplo do especificação de anotações de tipo:

@Readonly Document [][] docs1 = new @Readonly Document [2][12]; // array of arrays of read-only documents
Document @Readonly [][] docs2 = new Document @Readonly [2][12]; // read-only array of arrays of documents
Document[] @Readonly [] docs3 = new Document[2] @Readonly [12]; // array of read-only arrays of documents

Assim, podemos entender seus exemplos:

  • @Nullable Object @NonNull[][] significa "matriz não nula de matriz (não especificada) de elementos anuláveis"
  • @Nullable Object @NonNull[]@NonNull[] significa "matriz não nula de matriz não nula de elementos anuláveis"

Qual delas você prefere depende da sua especificação. Apenas "não bidimensionalnull matriz de anulável os elementos "não fornecem informações suficientes para saber a qual deles você está se referindo, mas é provavelmente o segundo.

(Esta pergunta também é respondida no Anotações de tipo FAQ.)