Usando coleções pequenas (1 a 10 itens) em nível de instância em Java
-
09-06-2019 - |
Pergunta
Ao criar classes em Java, muitas vezes me pego criando coleções em nível de instância que sei antecipadamente que serão muito pequenas - menos de 10 itens na coleção.Mas não sei o número de itens com antecedência, então normalmente opto por uma coleção dinâmica (ArrayList, Vector, etc).
class Foo
{
ArrayList<Bar> bars = new ArrayList<Bar>(10);
}
Uma parte de mim continua me incomodando dizendo que é um desperdício usar coleções dinâmicas complexas para algo tão pequeno.Existe uma maneira melhor de implementar algo assim?Ou esta é a norma?
Observe que não fui atingido por nenhuma penalidade de desempenho (perceptível) ou algo parecido.Sou só eu me perguntando se não existe uma maneira melhor de fazer as coisas.
Solução
O ArrayList
classe em Java tem apenas dois membros de dados, uma referência a um Object[]
array e um tamanho - que você precisará de qualquer maneira se não usar um ArrayList
.Então a única vantagem de não usar um ArrayList
está salvando a alocação de um objeto, o que provavelmente nunca será um grande problema.
Se você estiver criando e descartando muitas instâncias de sua classe de contêiner (e, por extensão, de seu ArrayList
por exemplo) a cada segundo, você poder tenho um pequeno problema com a rotatividade da coleta de lixo - mas isso é algo com que se preocupar se isso ocorrer.A coleta de lixo normalmente é a menor das suas preocupações.
Outras dicas
Para manter as coisas simples, acho que isso não é problema.Sua implementação é flexível o suficiente para que, se os requisitos mudarem no futuro, você não seja forçado a refatorar.Além disso, não vale a pena adicionar mais lógica ao seu código para uma solução híbrida, levando em consideração seu pequeno conjunto de dados e a alta qualidade da API Collection do Java.
Coleções do Google possui coleções otimizadas para um número imutável/pequeno de elementos.Ver Lists.asList
API como exemplo.
A sobrecarga é muito pequena.É possível escrever uma lista de array híbrida que tenha campos para os primeiros itens e depois voltar a usar um array para listas mais longas.
Você pode evitar totalmente a sobrecarga do objeto de lista usando um array.Para ir ainda mais longe, você pode declarar o campo como Object e evitar completamente o array para um único item.
Se a memória realmente for um problema, talvez você queira esquecer o uso de instâncias de objetos em baixo nível.Em vez disso, use uma estrutura de dados maior com um nível maior de granularidade.