Eu vi objetos criados no código Java sem armazenar uma referência ao objeto. Por exemplo, em um plug-in do eclipse, eu vi um SWT Shell criado assim:
new Shell();
Esse novo objeto Shell não é armazenado em uma variável, mas permanecerá referenciado até que a janela seja descartada, o que [acredito?] Acontece por padrão quando a janela é fechada.
É uma má prática criar objetos como esse sem armazenar uma referência a eles? Ou a biblioteca foi mal projetada? E se eu não precisar de uma referência, mas quiser apenas os "efeitos colaterais" do objeto? Devo armazenar uma referência de qualquer maneira?
ATUALIZAR:
É certo que meu exemplo acima é ruim. Embora eu tenha visto elementos da interface do usuário criados assim, a criação de um SWT Shell como esse provavelmente não faria sentido, porque você precisa chamar o método open na instância do Shell. Existem exemplos melhores fornecidos pelo aix , como os seguintes no tutorial sobre simultaneidade Java :
(new HelloThread()).start();
Essa prática é vista em muitos contextos, então as questões permanecem. É uma boa prática?
Shell.createTopLevelShell()
ou o que quer, vs usando um construtor neste caso, mas funcionalmente há pouca diferença..)dispose()
d: Regra 1: se você o criou, você o descarta. eclipse.org/articles/swt-design-2/swt-design-2.htmlRespostas:
Há um elemento de preferência pessoal nisso, mas acho que não armazenar a referência não é necessariamente uma má prática.
Considere o seguinte exemplo hipotético:
Se um novo objeto de processador precisar ser criado para cada arquivo e não for necessário após a
process()
chamada, não há sentido em armazenar uma referência a ele.Aqui está outro exemplo, retirado do tutorial de simultaneidade Java :
Eu já vi muitos outros exemplos quando a referência não é armazenada e parece perfeitamente correta para meus olhos, como:
(O
StringBuilder
objeto não é mantido.)Existem padrões semelhantes envolvendo common.lang's
HashCodeBuilder
et al.fonte
getInstance()
é uma fábrica e não um singleton).process
.Se você não precisar de uma referência ao objeto criado, não a segure. É simples assim.
fonte
Em geral, é uma boa prática liberar referências o mais rápido possível. Não vejo diferença entre:
e
No que diz respeito ao código, você está evitando o uso de um nome de variável, o que pode ser positivo. O compilador JIT geralmente é inteligente o suficiente para reconhecer que pode coletar lixo do encadeamento após seu último uso, portanto, provavelmente não há diferença do ponto de vista de desempenho.
O único problema real a ser evitado é o Código no Antipadrão do Construtor , mas não é disso que você está perguntando.
fonte
Isso pode ser ruim se você estiver usando o SWT, porque é preciso limpar depois de si mesmo (chamando o método dispose ()). Mas para outras classes (não SWT), tudo bem.
Aqui está um artigo sobre o gerenciamento de recursos do sistema operacional
fonte
Primeiro de tudo, você vai incomodar as pessoas que aprenderam C ou C ++ antes de Java. Vou deixar isso como um exercício para o leitor decidir se é um profissional ou um trapaceiro.
Embora certamente existam situações em que os objetos são projetados para durar muito pouco tempo, na maioria das vezes, se algo é complexo o suficiente para criar um objeto, é complexo o suficiente para ter boas razões para manter uma referência, portanto, não pelo menos, um aviso para verificar se você perdeu alguma coisa.
Por exemplo, em um tutorial, ninguém se preocupa em manter uma referência de encadeamento, mas na vida real, se algo demorar o suficiente para que você queira gerar um encadeamento, geralmente levará tempo suficiente para que você possa cancelar o encadeamento. Ou, se tiver vida mais curta, você normalmente gera vários tópicos que deseja
join
antes de continuar. Ou você deseja garantir que a criação do encadeamento seja bem-sucedida. Ou você deseja garantir que o encadeamento termine corretamente antes de sair. Você entendeu a foto.fonte