Para que serve get & set?

                                            [code][b]                 para que serve get & set?[/b][/code]

Utiliza-se getter e setter para acessar atributos privados de um objeto. É uma boa prática em java.

Na Orientação a Objetos, é uma boa prática também não permitir que outros objetos acessem suas variáveis diretamente. Chamamos isto de encapsulamento.

Vários frameworks java utilizam estes métodos para ter acesso aos atributos do objeto para persistir, acessar os dados, descobrir os atributos de uma classe, etc.

                          deme um exemplo pratico Arnaldo especialmente em não permitir que outros objetos acessem suas variáveis diretamente.

Leia: http://blog.caelum.com.br/2006/09/14/nao-aprender-oo-getters-e-setters/

class Pessoa{ int idade; public void setIdade(int idade) { this.idade = idade; } public int getIdade() { return this.idade; } } ... Pessoa p = new Pessoa(); p.setIdade(10); System.out.println("A idade dessa pessoa eh " + p.getIdade());

Suponha que você crie uma classe Cliente que tem um atributo CPF. No início você pensou que o atributo não necessitava de nenhuma validação ou processamento … depois de um tempo você decide que quer validar o CPF dentro da classe cliente. Seu sistema inteiro está acessando cliente.cpf, se você tem um sistema com vários componentes distribuidos em diversos jars, todos eles deverão ser alterados. O impacto da mudança aumenta consideravelmente.

Acho que esta faltando o private da variável @peczenyj, desculpas se tiver errado.

# class Pessoa{ private int idade; public void setIdade(int idade) { this.idade = idade; } public int getIdade() { return this.idade; } } ... Pessoa p = new Pessoa(); p.setIdade(10); System.out.println("A idade dessa pessoa eh " + p.getIdade());

Eu tento evitar ao máximo o uso indiscriminado de getters e setters. IMHO, não há um encapsulamento real quando você faz:

	public int getYearBorn() {
		return yearBorn;
	}

	public void setYearBorn(int yearBorn) {
		this.yearBorn = yearBorn;
	}

O que adianta esse get e esse set? Não há processamento, não há validação.

Claro que muitos frameworks não permitem que eu codifique como está exemplificado abaixo. Mas sempre que posso, faço dessa forma:

package br.com.celsomartins.agecalculator;

import java.util.Calendar;
import java.util.GregorianCalendar;

import br.com.celsomartins.agecalculator.exceptions.YearOutOfBoundsException;

public class Age {
	
	private int yearBorn = 0;
	private Calendar cal = GregorianCalendar.getInstance();

	public int calculatesAge(){
		return cal.get(Calendar.YEAR) - yearBorn;
	}
	
	public Age(int yearBorn) throws YearOutOfBoundsException {
		super();
		cal.setTimeInMillis(System.currentTimeMillis());
		if ((yearBorn >= cal.get(Calendar.YEAR))){
			throw new YearOutOfBoundsException("The year entered need to be less than current year");
		}
		this.yearBorn = yearBorn;
	}
}

É simples. Não existe calculadora de idade se você não fornece algum ano como entrada. Então, IMHO, um construtor sem argumentos não faz sentido. Dessa forma, foi o set pras cucuias.

Você não precisa retornar um valor que você mesmo forneceu, a princípio. Então foi o get para as cucuias também.

O que você precisa, na realidade, é calcular a idade de determinada coisa a partir de um determinado ano fornecido como entrada. Então a saída desse processo de negócio deveria ser o cálculo da idade.

Entrada -> Ano de nascimento de alguém ou alguma coisa
Processamento -> Cálculo da idade
Saída -> A idade calculada

Trazendo para a nossa área: A responsabilidade desta classe é fornecer a idade de algo, nada mais.

Hoje, sempre que posso (leia-se, os frameworks permitem), tento pensar e codificar dessa forma.

Abraços.

Perfeito o artigo.

E ai pessoal. Beleza?!

bem… deixando MINHA opnião PESSOAL.

Confundir Get/Set com o conceito encapsulamento da OO é um erro. O conceito Métodos de Acesso (Getter e Setter), virou um consenso em Java principalmente por causa das especificações de patterns como JavaBeans, Value Objecs e afins. A grande maioria das APIs e Frameworks trabalham em cima desse consenso. Deste modo, é uma Boa Prática de Programação utilizar este conceito quando for utilizar este tipo de pattern.

Este conceito só terá relação com o encapsulamento de seu código se o acesso a algum atributo da classe não for feito diretamente.

Exemplos simples seriam:

Métodos de Acesso SEM conceito de Encapsulamento

[code]public class Teste {
private Integer x;

public Integer getX() {
    return x;
}

}[/code]

Métodos de Acesso COM conceito de Encapsulamento

[code]public class Teste {
private Integer x;

public Integer getX() {
    if (x == null) {
        x = 0;
    }
    return x;
}

}[/code]

Espero ter ajudado. Até.

Programar OO não significa programar com classes cheias de gets e sets.

Entretanto, se eu quero levar informações para uma JSP eu posso usar JavaBeans, que são objetos com construtor padrão e com gets + sets, dessa forma posso usar Expression Language para acessar os atributos, ${cliente.nome}, que uma chamada de método correspondente sera executada, cliente.getNome(), automagicamente.

Porem uma classe mais rica como um Factory, um DAO, um Command ou um Strategy não precisa de gets + sets para todos os seus atributos.

public class ConnectionFactory { public static Connection getConnection(){ return DriverManager.getConnection(parametros); } }

Aqui o get é semantico: eu peço me dê uma conexão, mas não preciso dizer qual pois a factory sabe.