É uma prática boa / ruim / aceitável passar o objeto atual em uma chamada de método. Como em:
public class Bar{
public Bar(){}
public void foo(Baz baz){
// modify some values of baz
}
}
public class Baz{
//constructor omitted
public void method(){
Bar bar = new Bar();
bar.foo(this);
}
}
Especificamente, a linha é bar.foo(this)
aceitável?
Respostas:
Não há razão para não usá-lo,
this
é a instância atual e é perfeitamente legítimo para usar. Na verdade, geralmente não há uma maneira limpa de omiti-lo.Então use.
Como é difícil convencer que é aceitável sem exemplo (uma resposta negativa a essa pergunta é sempre mais fácil de argumentar), acabei de abrir uma das
java.lang
classes mais comuns , aString
, e é claro que encontrei exemplos desse uso, por exemploProcure
(this
em grandes projetos "aceitos", você não deixará de encontrá-lo.fonte
this
não significa adicionar um link bidirecional, por causa da herança e das interfaces, por exemplo.Não há nada de errado nisso. O que NÃO é uma boa prática é fazer o mesmo dentro dos construtores, porque você daria uma referência a um objeto ainda não completamente inicializado.
Há um tipo de postagem semelhante aqui: Java vazando isso no construtor, onde eles dão uma explicação de por que o último é uma prática ruim.
fonte
Car
construtor pode criarWheel
instâncias, umCar
semWheel
seria inicializado de forma incompleta, enquanto umWheel
sem um correspondenteCar
também seria inicializado de forma incompleta. Nesse caso, pode ser aceitável no construtor do carro passarthis
para o construtor da roda. A outra alternativa seria fazer com que o carro e a roda tivessem um construtor privado e usar uma função de fábrica que constrói o carro, a roda e instala a roda no carro; mas deveria ser um método estático em Car ou um método estático em Wheel?CarFactoryWheelInstallerProxy
que instale as rodas para você.Wheel
é totalmente subordinado aCar
, e a IMO não deveria saber dissoCar
.this
de dentro de um construtor é sethis
for passado para um método ou contexto a partir do qual a referência de objeto ainda não totalmente construída é publicada para clientes não confiáveis ou desconhecidos (ou código de cliente que assume que tem uma visão para um objeto totalmente construído). Passarthis
de um construtor para um método privado de pacote que executa uma inicialização comum é, na minha opinião, não apenas aceitável, mas desejável.Sim , mas você deve ter cuidado com duas coisas
fonte
this
para ele. Isso teria sido impossível se o objeto não tivesse sido alocado.É perfeitamente normal e perfeitamente aceitável.
fonte
isso representa o objeto atual. O que você está fazendo é sistematicamente correto, mas não vejo necessidade disso se você estiver chamando o método na mesma classe.
fonte
this
entre as duas classes. Portanto, não há necessidade de adicionar complexidade extra.É uma má prática passar o objeto atual em uma chamada de método se houver alternativas menos complexas para obter o mesmo comportamento.
Por definição, uma associação bidirecional é criada assim que
this
é passada de um objeto para outro.Para citar Refatoração, por Martin Fowler:
Então, teoricamente, deveríamos estar ouvindo alarmes quando acharmos que precisamos passar
this
e tentar realmente pensar em outras maneiras de resolver o problema em questão. É claro que há momentos em que, em último recurso, faz sentido fazer isso.Também é frequentemente necessário corromper seu design temporariamente, fazendo 'coisas de prática ruim', durante uma refatoração de longo prazo de seu código para uma melhoria geral. (Um passo para trás, dois passos para a frente).
Na prática, descobri que meu código melhorou muito , evitando links bidirecionais como a praga.
fonte
this
é aprovada.equals
é Objeto. Isso é muito comum: o método receptor define seu argumento como uma classe mais geral ou como uma interface. Uma das razões pelas quais esse padrão é usado em java é para evitar dependências indesejadas. Antes de prosseguir, sugiro que você dê uma olhada nas muitas ocorrências de passagemthis
como argumento em bibliotecas Java respeitáveis.this
meu código, sempre que possível. Eu recomendaria que outros o fizessem.Sim. você pode usá-lo. É comum na programação passar
this
. Mas há prós e contras em usar isso. Ainda assim, não é perigoso fazer isso.fonte
Apenas para adicionar mais um exemplo em que a passagem
this
é correta e segue um bom design: Padrão de visitante . No padrão de design do Visitante, o métodoaccept(Visitor v)
é geralmente implementado de uma maneira que ele apenas chamav.visit(this)
.fonte
Aceitável
Snippet de documentos Oracle JAVA:
fonte
this
como parâmetro? ”.this.some_variable
para se referir à variável de classe em vez de uma variável local. Não tem nada a ver com passarthis
como parâmetro.Tudo em java é passado por valor. Mas os objetos NUNCA são passados para o método!
Quando java passa um objeto para um método, ele primeiro faz uma cópia de uma referência ao objeto, não uma cópia do próprio objeto. Portanto, este é um método perfeitamente usado em java. E o uso mais comumente seguido.
fonte
this
referência a um tipo primitivo e, portanto, acho que suas "mais informações" estão causando confusão.