Como faço para evitar igualdade entre objectos em java?
Eu quero por exemplo :
Pessoa A = New Pessoa();
Pessoa B = A;
Pessoa C = New Pessoa("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 ?
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).
[quote=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.[/quote]
Sim, mas depois ele atribui a B o valor de C, portanto não tem mais ligação com A.
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
[quote]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[/quote]
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.
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[/quote]
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.
class Pessoa (){
public Pessoa(){} // construtor padrão
public Pessoa(Pessoa other){
// construtor de cópia
this.nome = other.nome;
this.idade = other.idade;
// etc...
}
}
// uso
Pessoa A = new Pessoa("Ana",16,"São Paulo");
Pessoa B = new Pessoa(A);
// aqui B.nome é 'ana' e A.nome também é 'ana"
B.setNome("filipe")
// aqui B.nome é 'filipe' e A.nome ainda é 'ana"
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[/quote]
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.
class Pessoa (){
public Pessoa(){} // construtor padrão
public Pessoa(Pessoa other){
// construtor de cópia
this.nome = other.nome;
this.idade = other.idade;
// etc...
}
}
// uso
Pessoa A = new Pessoa("Ana",16,"São Paulo");
Pessoa B = new Pessoa(A);
// aqui B.nome é 'ana' e A.nome também é 'ana"
B.setNome("filipe")
// aqui B.nome é 'filipe' e A.nome ainda é 'ana"
[/quote]
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?
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...
public class Pessoa implements Cloneable {
private String nome; private int idade;
public Pessoa() { }
public Pessoa(String nome, int idade) { this.nome = nome; this.idade = idade; }
// A seguir, é recomendável ter um construtor de cópia, embora isso não seja mandatório...
public Pessoa (Pessoa that) { this.nome = that.nome; this.idade = that.idade; }
// E a seguir devemos declarar o método clone EXATAMENTE como abaixo:
public Object clone() {
return new Pessoa (this);
}
// aqui vão os outros métodos, como setters e getters
}
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.
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. [/quote]
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 ?
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.
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%
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