Esclarecimento sobre Get and Set

Bom dia
Estou quase entendendo eles… Mas quero tirar uma duvida.

quando vc configura um setter pra uma variavel private o set altera o valor dela correto? E o get vai retornar o valor.

Entao por que nao se pode alterar o valor da variavel diretamente? Sendo que ela vai ser alterada de qualquer forma?

Bom se eu tiver errado me corrijam tbm…

Abçs a todos

[quote=arthuroaraujo]Bom dia
Estou quase entendendo eles… Mas quero tirar uma duvida.

quando vc configura um setter pra uma variavel private o set altera o valor dela correto? E o get vai retornar o valor.

Entao por que nao se pode alterar o valor da variavel diretamente? Sendo que ela vai ser alterada de qualquer forma?

Bom se eu tiver errado me corrijam tbm…

Abçs a todos[/quote]
Você entende de orientação a objetos? Pelo que vejo, está tentando.
Pense no seguinte, quando você quer saber o nome de um outro objeto pessoa, como você faz? Você vai e pega diretamente o nome desta pessoa ou pergunta?
Quando você vai dirigir, simplesmente pega e muda o atributo estadoDoMotor de “desligado” para “ligado” ou você dispara a ação ligarMotor?
Ahn?
Os objetos, no mundo real, não acessam diretamente as propriedades dos outros, mesmo que não haja nenhum controle sobre estes atributos. É comum o uso de métodos, mesmo que não tenhamos nem noção de qual é este método e quando é chamado.
A UML dá uma noção bem legal quanto a isso, no conjunto diagrama de classes e diagrama de sequência. No diagrama de classes você tem os métodos e no diagrama de sequência a ordem em que as mensagens (sim, mensagem é o termo utilizado para designar a interação entre um objeto e outro) são enviadas e recebidas.

[quote=arthuroaraujo]Bom dia
Estou quase entendendo eles… Mas quero tirar uma duvida.

quando vc configura um setter pra uma variavel private o set altera o valor dela correto? E o get vai retornar o valor.

Entao por que nao se pode alterar o valor da variavel diretamente? Sendo que ela vai ser alterada de qualquer forma?

Bom se eu tiver errado me corrijam tbm…

Abçs a todos[/quote]

Dúvida hiper válida. Pragmáticamente falando, você tem razão em um primeiro momento.
Da uma lida neste link: http://blog.caelum.com.br/nao-aprender-oo-getters-e-setters/

De qualquer forma, primeiro você aprende a usar essa burocratização da linguagem (expor os membros privados através de métodos acessores, ou seja, getters e setters) e depois, quando souber exatamente o que está fazendo, deixar de fazer isso em determinados casos :slight_smile:

Em termos de tempo de execução, leva exatamente a mesma coisa que o acesso “bruto” se os getters e setters foram compilados pelo JIT. (Você pode forçar isso ou então desativar isso, usando -XX:+UseFastAccessors ou -XX:-UseFastAccessors) .

[quote=arthuroaraujo]Bom dia
Estou quase entendendo eles… Mas quero tirar uma duvida.

quando vc configura um setter pra uma variavel private o set altera o valor dela correto? E o get vai retornar o valor.

Entao por que nao se pode alterar o valor da variavel diretamente? Sendo que ela vai ser alterada de qualquer forma?

Bom se eu tiver errado me corrijam tbm…

Abçs a todos[/quote]

Um exemplo fácil de lembrar é a classe conta (foi o primeiro contato que tive com POO, graças a maravilhosa apostila da Caelum).

class Conta {

	private String dono;
	private double saldo;

	public String getDono() {
		return dono;
	}

	public void setDono(String dono) {
		this.dono = dono;
	}

	public double getSaldo() {
		return saldo;
	}

	public void setSaldo(double saldo) {
		this.saldo = saldo;
	}

}

Não faz sentido, por exemplo, existir aquele setSaldo. Ao invés disso você deveria ter métodos como saca e deposita não concorda? Afinal você não pode simplesmente escolher o seu saldo.

class Conta {

	private String dono;
	private double saldo;

	public String getDono() {
		return dono;
	}

	public void setDono(String dono) {
		this.dono = dono;
	}

	public void saca(double valor) {
		saldo = saldo - valor;
	}
	
	public void deposita(double valor) {
		saldo = saldo + valor;
	}

}

[quote=kicolobo][quote=arthuroaraujo]Bom dia
Estou quase entendendo eles… Mas quero tirar uma duvida.

quando vc configura um setter pra uma variavel private o set altera o valor dela correto? E o get vai retornar o valor.

Entao por que nao se pode alterar o valor da variavel diretamente? Sendo que ela vai ser alterada de qualquer forma?

Bom se eu tiver errado me corrijam tbm…

Abçs a todos[/quote]

Dúvida hiper válida. Pragmáticamente falando, você tem razão em um primeiro momento.
Da uma lida neste link: http://blog.caelum.com.br/nao-aprender-oo-getters-e-setters/[/quote]

Hmmm eu sabia que já tinha visto o exemplo que eu acabei de postar em algum lugar (que não fosse na apostila da Caelum).

[quote=entanglement]De qualquer forma, primeiro você aprende a usar essa burocratização da linguagem (expor os membros privados através de métodos acessores, ou seja, getters e setters) e depois, quando souber exatamente o que está fazendo, deixar de fazer isso em determinados casos :slight_smile:

Em termos de tempo de execução, leva exatamente a mesma coisa que o acesso “bruto” se os getters e setters foram compilados pelo JIT. (Você pode forçar isso ou então desativar isso, usando -XX:+UseFastAccessors ou -XX:-UseFastAccessors) .[/quote]

Discordo. Esta é a maneira errada de se aprender OO.
O princípio básico por trás da OO é expor apenas o que for realmente necessário ser exposto para os demais objetos clientes.
A partir do momento em que você começa a expor gets e sets que não tem utilidade alguma, estão lá apenas para cumprir tabela, o princípio básico do bom design OO que é expor apenas o necessário se perde, você se vicia e, ainda pior, acaba usando mal o paradigma pro resto da sua vida profissional se não ficar atento.
É por isto que o link que expus é tão bacana, é justamente sobre este problema.

[quote=kicolobo][quote=entanglement]De qualquer forma, primeiro você aprende a usar essa burocratização da linguagem (expor os membros privados através de métodos acessores, ou seja, getters e setters) e depois, quando souber exatamente o que está fazendo, deixar de fazer isso em determinados casos :slight_smile:

Em termos de tempo de execução, leva exatamente a mesma coisa que o acesso “bruto” se os getters e setters foram compilados pelo JIT. (Você pode forçar isso ou então desativar isso, usando -XX:+UseFastAccessors ou -XX:-UseFastAccessors) .[/quote]

Discordo. Esta é a maneira errada de se aprender OO.
O princípio básico por trás da OO é expor apenas o que for realmente necessário ser exposto para os demais objetos clientes.
A partir do momento em que você começa a expor gets e sets que não tem utilidade alguma, estão lá apenas para cumprir tabela, o princípio básico do bom design OO que é expor apenas o necessário se perde, você se vicia e, ainda pior, acaba usando mal o paradigma pro resto da sua vida profissional se não ficar atento.
É por isto que o link que expus é tão bacana, é justamente sobre este problema.

[/quote]
Kiko, creio que a idéia do entanglement ao responder o tópico foi a de sugerir o contínuo refinamento do conhecimento.
Quando se começa a aprender programação, primeiro ensina-se o uso indiscriminado de variáveis sem modificadores muito restritivos. Depois, apresenta-se o private e o protected. E assim sucessivamente.
Quando a pessoa está com pleno entendimento do que isso representa, começa a perceber que vários getters são desnecessários e, é neste ponto, que estra o post que você citou.

Vcs sao os caras.
Ja tiraram minha duvida, vlw!!

Abçs
Arthuro