Evitar Igualidade entre Objectos

Alo pessoal, estou com uma duvida simples

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 ?

Mas A não está sendo afectado. Imprimiste A, por acaso?

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=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.

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.

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

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.

[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.

Espero q tenha ajudado.

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?

Eu ja tentei ate usar clone() mas não funcionou… ele continua a considerar no caso A = B

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...
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%

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

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