Como faço para evitar igualdade entre objectos em java?
Eu quero por exemplo :
PessoaA=NewPessoa();PessoaB=A;PessoaC=NewPessoa("Antonio",16,"São Paulo");B=C;Imprimir(A);Imprimir(B);Imprimir(C);// EU NÃO QUERO QUE OS 3 OBJECTOS IMPRIMAM O MESMO VALOR
Existe maneira de fazer com que o valor de C passado a B não afecte A ?
Mas A não está sendo afectado. Imprimiste A, por acaso?
J
juniorsml
Por favor, me corrijam se eu estiver errado, mas qnd vc faz a referencia B=A vc simplemente aponta a variavel B para o objeto em memoria A sendo que os dois vão apontar para o msm objeto, qnd vc alterar b irá refletir em A. No caso vc precisaria instanciar um novo objeto com o valor de a b = new (A).
Espero que isso ajude.
Rodrigo_Sasaki
juniorsml:
Por favor, me corrijam se eu estiver errado, mas qnd vc faz a referencia B=A vc simplemente aponta a variavel B para o objeto em memoria A sendo que os dois vão apontar para o msm objeto, qnd vc alterar b irá refletir em A. No caso vc precisaria instanciar um novo objeto com o valor de a b = new (A).
Espero que isso ajude.
Sim, mas depois ele atribui a B o valor de C, portanto não tem mais ligação com A.
J
juniorsml
sim vc esta certo, não tinha reparado o new no C, com certeza o B não tem mais nada com o A. B não irá refletir no A.
ruben_m
Vamos tentar esquecer a linha em que Igualo B a C!
Na verdade eu quero saber se existe alguma forma de eu evitar esse Relacionamento entre A e B quando Faço A=B , eu simplismente não quero que ao mecher-se nos valores de A eles mexam os de B
marlonjke
Na verdade, fazendo B= A, você está referenciando B à posição de memória do objeto A. Logo, os dois referenciam o mesmo objeto.
Para criar um novo objeto independente de A você precisa fazer de B um clone do objeto A.
di.magdaleno
Vamos tentar esquecer a linha em que Igualo B a C!
Na verdade eu quero saber se existe alguma forma de eu evitar esse Relacionamento entre A e B quando Faço A=B , eu simplismente não quero que ao mecher-se nos valores de A eles mexam os de B
Como dito anteriormente, ao igualar a variavel de referencia A com a variavel de referencia B, voce esta apenas igualando o endereco na memoria para o qual estao apontando, portanto, farao referencia ao mesmo objeto.
Uma solucao para o seu problema seria igualar os atributos dos objetos um a um. Por exemplo:
A.nome = B.nome;
A.idade = B.idade;
[...]
Dessa forma vc passaria apenas os valores dos atributos de um objeto para outro.
Espero q tenha ajudado.
sergiotaborda
Vamos tentar esquecer a linha em que Igualo B a C!
Na verdade eu quero saber se existe alguma forma de eu evitar esse Relacionamento entre A e B quando Faço A=B , eu simplismente não quero que ao mecher-se nos valores de A eles mexam os de B
O que vc quer é copiar o valor de A para B, mas não o A em si mesmo. Ou seja, vc quer ter dois objetos A e B que são dois objetos, mas são iguais ( como dois gemeos).
Se um dos gemeos perde um braço não significa que o outro tb irá perder.
Para isso vc precisa criar uma cópia de A.
Existem várias formas. Vc pode tornar ele clonável implementando a interface Clonable. Mas isso não é muito simples nem muito util.
A forma mais simples é vc criar um construtor de cópia. Isto é um construtor que recebe omo argumento um objeto da mesma classe e inicializa os privates com os valores que estão no outro objeto. Assim vc mantém dois objetos que são iguais, mas não são o mesmo.
Vamos tentar esquecer a linha em que Igualo B a C!
Na verdade eu quero saber se existe alguma forma de eu evitar esse Relacionamento entre A e B quando Faço A=B , eu simplismente não quero que ao mecher-se nos valores de A eles mexam os de B
O que vc quer é copiar o valor de A para B, mas não o A em si mesmo. Ou seja, vc quer ter dois objetos A e B que são dois objetos, mas são iguais ( como dois gemeos).
Se um dos gemeos perde um braço não significa que o outro tb irá perder.
Para isso vc precisa criar uma cópia de A.
Existem várias formas. Vc pode tornar ele clonável implementando a interface Clonable. Mas isso não é muito simples nem muito util.
A forma mais simples é vc criar um construtor de cópia. Isto é um construtor que recebe omo argumento um objeto da mesma classe e inicializa os privates com os valores que estão no outro objeto. Assim vc mantém dois objetos que são iguais, mas não são o mesmo.
entendi! Mas como funcionaria se eu implementa-se a interfase clonable?
A soluçao que citas te ate é boa, nas tem um problema no projecto que estou a trabalhar, porque estou a tentar igualar 2 JFrames, mas de maneira que cada um nao mecha o outro, a ideia de igualar atributo a atributo no caso de JFrame é um pouco dolorosa! Quero eu acreditar que implementar a interface clonable seja uma soluçao mais bonita! Agora nao sei se tens ujm exemplo de como isso é feito?
ruben_m
Eu ja tentei ate usar clone() mas não funcionou… ele continua a considerar no caso A = B
E
entanglement
Object.clone() sozinho não faz nada.
Se você não indicar corretamente na definição da classe a burocracia que vou indicar a seguir, Object.clone() retorna o próprio objeto, em vez de retornar uma cópia.
Para um objeto implementar corretamente a interface Cloneable, você tem de fazer algo como:
// primeiro você tem de dizer que a classe implementa Cloneable...publicclassPessoaimplementsCloneable{privateStringnome;privateintidade;publicPessoa(){}publicPessoa(Stringnome,intidade){this.nome=nome;this.idade=idade;}// A seguir, é recomendável ter um construtor de cópia, embora isso não seja mandatório...publicPessoa(Pessoathat){this.nome=that.nome;this.idade=that.idade;}// E a seguir devemos declarar o método clone EXATAMENTE como abaixo:publicObjectclone(){returnnewPessoa(this);}// aqui vão os outros métodos, como setters e getters}
E
entanglement
Não é recomendável você criar uma classe que estende JFrame e implementa Cloneable.
Há muitos atributos (na classe JFrame) que não podem ser clonados. (Tente ler a implementação da classe javax.swing.JFrame e tentar entender o que estou falando. Para evitar problemas esquisitos, evite tentar clonar um JFrame).
De qualquer maneira, você não deve clonar JFrame e sim os dados subjacentes a esse JFrame, se for o caso.
ruben_m
Não é recomendável você criar uma classe que estende JFrame e implementa Cloneable.
Há muitos atributos (na classe JFrame) que não podem ser clonados. (Tente ler a implementação da classe javax.swing.JFrame e tentar entender o que estou falando. Para evitar problemas esquisitos, evite tentar clonar um JFrame).
De qualquer maneira, você não deve clonar JFrame e sim os dados subjacentes a esse JFrame, se for o caso.
Entendo, estava querendo mesmo implementar um sistema de Undo e Redo em um Programa meu, e queria fazer na base de uma coleção que armazena-se todos os estados anteriores e em seguida ele ia modificando… estava tudo bem planificado! mas falhei nesse pequeno aspecto!!! Será que alguem tem uma ideia de outra maneira para fazer isso ?
E
entanglement
Faça desse jeitinho mesmo, mas como eu lhe disse, não é para clonar o JFrame inteirinho, mas os dados que você precisa fazer o undo/redo. Normalmente esses dados costumam ser strings ou coisas parecidas.
ruben_m
A minha tela é um JPanelque esta dentro do JFrame em que dentro dele ha varias coisas, como rectangulos que vou desenhando … o programa é uma mini ferramenta CASE, que so não gera o Script no final, mas da para fazer modelações e criar relacionamentos! o problema é que mesmo fazendo a igualidade de componentes, alguns componetes internos, como o caso de Tabelas que vou criando não deixam de apontar aos seus Originais, o que faz com que o Undo e Redo não funcione a 100%
ruben_m
Valeu… vou tentar. definitivamente java != C++ … hehehehe em C++ ja era possivel modificar os endereços ! hahahaha
Espero que um dia alguem veja isso ai! hahahaha
ruben_m
tentei , elemento a elemeto … nunca volta a ficar igual… existem bastantes elementos dentro do Jpanel que esta dentro JFrame como quadrados, etc, que sao apagados e nao voltam ao mesmo devido a esse problema de igualidade de objectos