Eu consigo escrever:
AClass[] array = {object1, object2}
Eu também posso escrever:
AClass[] array = new AClass[2];
...
array[0] = object1;
array[1] = object2;
mas não sei escrever:
AClass[] array;
...
array = {object1, object2};
Por que isso é bloqueado pelo Java?
Eu sei como contornar isso, mas de tempos em tempos seria mais simples.
Por exemplo:
public void selectedPointsToMove(cpVect coord) {
if (tab == null) {
if (arePointsClose(coord, point1, 10)) {
cpVect[] tempTab = {point1};
tab = tempTab;
} else if (arePointsClose(point2, coord, 10)) {
cpVect[] tempTab = {point2};
tab = tempTab;
} else {
cpVect[] tempTab = {point1,point2};
tab = tempTab;
}
}
}
Esta pergunta simples que me incomoda desde que aprendi a brincar com matrizes em Java.
Respostas:
Você teria que perguntar aos designers de Java. Pode haver alguma razão gramatical sutil para a restrição. Observe que algumas das construções de criação / inicialização da matriz não estavam no Java 1.0 e (IIRC) foram adicionadas no Java 1.1.
Mas "por que" é imaterial ... a restrição existe, e você tem que viver com ela.
Você pode escrever isto:
fonte
{o1()}
era uma expressão válida e{o1();}
era um bloco de instrução válido. O analisador precisa chegar ao '}' ou ';' antes que possa distinguir os dois casos. A questão gramatical não é nada sutil !!Tentarei responder à pergunta do porquê: O array Java é muito simples e rudimentar, comparado a classes como ArrayList, que são mais dinâmicas. Java deseja saber no momento da declaração quanta memória deve ser alocada para a matriz. Um ArrayList é muito mais dinâmico e seu tamanho pode variar ao longo do tempo.
Se você inicializar sua matriz com o comprimento de dois e, posteriormente, precisar de um comprimento de três, terá que jogar fora o que possui e criar uma nova matriz. Portanto, a palavra-chave 'new'.
Nos seus dois primeiros exemplos, você diz no momento da declaração quanta memória alocar. No seu terceiro exemplo, o nome da matriz se torna um ponteiro para nada e, portanto, quando é inicializado, você precisa criar explicitamente uma nova matriz para alocar a quantidade certa de memória.
Eu diria que (e se alguém souber melhor, por favor me corrija) o primeiro exemplo
na verdade significa
mas o que os designers de Java fizeram foi facilitar a escrita, se você criar a matriz no momento da declaração.
As soluções alternativas sugeridas são boas. Se o tempo ou o uso da memória forem críticos no tempo de execução, use matrizes. Se não for crítico, e você deseja um código mais fácil de entender e trabalhar, use ArrayList.
fonte
{
e o}
... exatamente como faz para os formulários inicializadores permitidos.Não sei responder a parte do porquê.
Mas se você quer algo dinâmico, por que não considera Collection ArrayList.
ArrrayList pode ser de qualquer tipo de objeto.
E se, como compulsão, você desejar como uma matriz, poderá usar o método toArray ().
Por exemplo:
Espero que isso possa ajudá-lo.
fonte
Para aqueles de vocês que não gostam dessa
new AClass[] { ... }
sintaxe monstruosa , aqui está um pouco de açúcar:Use esta pequena função como você gosta:
fonte