Atributo modifcado

2 respostas
E

A classe possui estes atributos, que da maneira que estão colocados, não eram para ser modificados pelos outros metodos:

import java.util.*;

public class Teste_Hash3 {

	private final Collection<String> c;
	private final List<String> list;


public Teste_Hash3(Collection<String> c, List<String> list){
	//a collection deve estar vazia, e ela será 
	//preenchida com as strings da list
	this.c = c;
	c.addAll(list);
	this.list =list;
}

public void verificador1(){
	Collection<String> aux = c;
	int tam = aux.size();
	aux.add(list.get(2));
	if(tam == aux.size()){
		System.out.println("Esta coleção não permite a inclusão de elementos duplicados!");
	}
	else
	{
		System.out.println("Esta coleção permite a inclusão de elementos duplicados!");		
	}
	public void verificar(){
	System.out.println(c);
	verificador1();
	System.out.println(c);
}

Porém, quando rodo esse programa, sai:

[Janeiro, Fevereiro, Março, Abril, Maio, Fevereiro]
Esta coleção permite a inclusão de elementos duplicados!
[Janeiro, Fevereiro, Março, Abril, Maio, Fevereiro, Março]

A terceira linha deveria imprimir a mesma coisa da primeira linha, usei até um aux para não mexer diretamente com ela, mas por algum motivo, ela tambem é modificada junto com a aux.
Como fazer para ela se manter a mesma, apos a passagem do verificador1?

2 Respostas

N

Pq não usar Set?

L

O que acontece é que c é um objeto global… quando no verificador1 vc faz

Collection<String> aux = c;

Você não copia a coleção c para a aux… vc aponta o endereço de memória de c para a aux… ou seja, aux e c passam a apontar para o mesmo local de memória… qualquer alteração em aux, altera c e vice-versa… o correto seria algo como

aux.addAll(c)

Nesse caso, aux e c apontam para locais diferentes da memória

Criado 18 de junho de 2016
Ultima resposta 18 de jun. de 2016
Respostas 2
Participantes 3