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 № 1Ao 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.)