Dúvida com os métodos get() e set() [RESOLVIDO]

10 respostas
oddy.silva

Pessoal, eu estava estudando encapsulamento no meu livro, o “Use a Cabeça! Java”, quando cheguei até a parte que fala dos métodos get() e size(). Eu entendi que get() pega um argumento passado a ele e o método set configura esse falor. Seguindo nessa linha de raciocínio, o primeiro a funcionar é get(), para depois set() entrar. Porém, no exemplo do livro, eu tive a sensação de que está ao contrário. Parece que set() entra primeiro para depois get(). Eu vou colocar abaixo o código do livro e onde pintou a dúvida para vocês darem uma olhada:

class GoodDog {
	private int size;
	
	public int getSize() {
		return size; 
	}

	public void setSize(int s) {
		size = s;

	void bark() {
		if (size > 60) {
			System.out.println("Woof! Woof!");
			
		
		} else if (size > 14) {
			System.out.println("Ruff! Ruff!");

		} else { 
			System.out.println("Yip! Yip!");
		} //fim do IF
	} //fim do método
} //fim da classe

class GoodDogTesteDrive {
	public static void main(String [] args) {
		GoodDog one = new GoodDog();
		one.setSize(70); //aqui não deveria ser one.getSize()?
		GoodDog two = new GoodDog();
		two.setSize(8); //aqui tambem
		System.out.println("Dog one: " + one.getSize()); //aqui não deveria ser one.setSize()?
		System.out.println("Dog two: " + two.getSize()); //aqui tbm, não?
		one.bark();
		two.bark();
	} //fim do método main
}fim da classe

A crica que ficou na minha cabeça é em relação a ordem em que cada método deve entrar. Se alguém puder explicar detalhadamente, passo-a-passo, como os métodos get() e set() acima estão se comportando, inclusive a ordem em que cada um entra em ação, eu agradeço. um abraço a todos.

10 Respostas

furacao123

one.setSize(70); two.setSize(8);

esta correto voce instanciou 2 objetos o one e o two da classe GoodDog

“setou” os valores para esses objetos e logo abaixo usando o get vc imprimiu

pq vc axa q deveria ser o contrario??

isso serve para encapsular sua aplicaçao tente fazer 2 classes separadas a GoodDog e outra GoodDogTesteDrive separadamente ae usando o get, set e pensando como se tivesse trabalhando com banco de dados, vc vai intender melhor pq do get e set.

abelgomes

nao importa a ordem…se no seu contrutor tiver inicializando o atributo sizer com 60 entao vc so precisa dar um get…ai vai de caso para caso…

entao não fica com esse grilo na cabeça nao e continua lendo o livro la na frente vc vai sacar isso…

por exemplo se vc desse getSize antes de dar um set ele ia dar nullpointerexception pq nao tinha na da lá :wink:

Lucas_Lacerda_Gertel

Então meu velho.
Na verdade não existe uma ordem obrigatória para chamada destes métodos.
O set() você define o valor do atributo e o get() você recupera.

No caso do teu objeto GoodDog, ele primeiro define o valor 70, pois se ele utilizasse o getSize ele viria como null pois não tem um valor definido na classe.
O get() recupera o valor do atributo e o set() define.

Imagine que você não sabe se já existe um valor definido e você precisa definir um caso não exista…
Ai você chamaria primeiro o get().

if (one.getSize() == null ) {
    one.setSize(70);
}
System.out.println(one.getSize());

Acho que é isso!
Abraços,

M

1º - Você cria um objeto do tipo GoodDog chamado ‘one’. A JVM chama o construtor padrão, ou seja o valor de size é o padrão (zero).

GoodDog one = new GoodDog();

2º - Você DEFINE o atributo ‘size’ de ‘one’ através do método ‘setSize(int)’.

one.setSize(70); // agora size vale 70

3º - Cria outro objeto do tipo GoodDog chamado ‘two’.

GoodDog two = new GoodDog();

4º - Altera seu tamanho para 8 através de setSize(int).

two.setSize(8);

5º - Você RESGATA e imprime os valores em ‘size’ de ambos os objetos, através do método ‘getSize()’.

System.out.println("Dog one: " + one.getSize());
System.out.println("Dog two: " + two.getSize());

6º - Manda ambos os cachorros latirem através do método ‘bark()’. Esse método faz a verificação do tamanho do cão para definir o tipo de latido.

one.bark();  
two.bark();

Entendeu agora?

cris.t

O que acontece no seu exemplo é o seguinte:
De acordo com o tamanho do Cachorro “Good Dog” e vai latir de um jeito.
então no seu metodo main vc cria dois objetos GoodDog e atribui o tamanho “size” para o dogOne com o valor 70, usando o método setSize(int size), e para o dogTwo com o valor 8.

Depois vc imprime no console os tamanhos que vc atribui para cada um acima, então vc usa o metodo getSize().

Ou seja primeiro vc usou o set para atribui um valor para o objeto, tanto que nos metodos set vc precisa passar um valor.
E para “pegar” o valor que vc atribuiu vc vai usar o get.

M

Lucas Lacerda Gertel:
Então meu velho.
Na verdade não existe uma ordem obrigatória para chamada destes métodos.
O set() você define o valor do atributo e o get() você recupera.

No caso do teu objeto GoodDog, ele primeiro define o valor 70, pois se ele utilizasse o getSize ele viria como null pois não tem um valor definido na classe.
O get() recupera o valor do atributo e o set() define.

Imagine que você não sabe se já existe um valor definido e você precisa definir um caso não exista…
Ai você chamaria primeiro o get().

if (one.getSize() == null ) {
    one.setSize(70);
}
System.out.println(one.getSize());

Acho que é isso!
Abraços,


É quase isso. A sua condição nunca vai ser verdadeira, pois ‘size’ é um ‘int’ e tipos primitivos nunca são null (null é apenas para referência para objetos). O correto seria:

if (one.getSize() == 0 ) { // se é igual a zero, o valor não foi definido ainda
    one.setSize(70);
}
System.out.println(one.getSize());
oddy.silva

Como eu adoro o pessoal do GUJ!!!

Primeiramente, obrigado as pessoas que estão me ajudando até este momento.

Deixa eu ver se assimilei bastante coisa até agora.
No meu exemplo, set() entra primeiro porque a priori a minha variável size possui valor null. É isso? Depois é resgatado o valor com get(). Isso mesmo? Se eu estiver errado me corrijam.

Mas se eu tivesse declarado a minha variável size e já lhe atribuido um valor? Eu poderia então usar get() primeiro, passar os argumentos para set() e então mostrar um resultado num possível System.out.println?

Abraço!!! Grato!!!

Lucas_Lacerda_Gertel

Opa, verdade…
Não é null não cara é 0.
null seria se sua variavel fosse declarada como Integer e não int.

Tipo primitivo sux…rs.

Abrax

oddy.silva

É, acabei de ver esse detalhe no livro tbm. Alguém viu a minha última pergunta?

M

oddy.silva:
Como eu adoro o pessoal do GUJ!!!

Primeiramente, obrigado as pessoas que estão me ajudando até este momento.

Deixa eu ver se assimilei bastante coisa até agora.
No meu exemplo, set() entra primeiro porque a priori a minha variável size possui valor null. É isso? Depois é resgatado o valor com get(). Isso mesmo? Se eu estiver errado me corrijam.

Mas se eu tivesse declarado a minha variável size e já lhe atribuido um valor? Eu poderia então usar get() primeiro, passar os argumentos para set() e então mostrar um resultado num possível System.out.println?

Abraço!!! Grato!!!

O valor inicial de size é 0 (zero) e não null. E quanto a segunda parte, é isso mesmo. Se no construtor da classe (você já aprendeu sobre construtores?) você definir um valor padrão, você pode acessá-lo antes mesmo de usar um set.

Criado 7 de janeiro de 2009
Ultima resposta 7 de jan. de 2009
Respostas 10
Participantes 6