Dúvida com encapsulamento (set/get)

Minha dúvida é a seguinte:

Código sem encapsulamento:

[code]class Documento
{
String nome;
Integer idade;

}

public class Ecm
{
public static void main( String args[])
{
Documento doc1 = new Documento();

	doc1.nome = "Shaft";
	doc1.idade = 26;
	
	System.out.println("Nome: " + doc1.nome);
	System.out.println("Idade: " + doc1.idade);
	
}

}[/code]

Código com encapsulamento:

[code]class Documento
{
private String nome;
private Integer idade;

public void setNome( String nome )
{
	this.nome = nome;
	
}

public String getNome()
{
	return nome;
	
}

public void setIdade( Integer idade )
{
	this.idade = idade;
	
}

public Integer getIdade()
{
	return idade;
	
}

}

public class Ecm
{
public static void main( String args[])
{
Documento doc1 = new Documento();

	doc1.setNome("Shaft");
	doc1.setIdade(26);
	
	System.out.println("Nome: " + doc1.getNome());
	System.out.println("Idade: " + doc1.getIdade());
	
}

}[/code]

  1. O encapsulamento é feito para que não se altere um atributo de um objeto diretamente mas sim por meios de métodos certo? Neste caso se o que o programa faz é altera o atributo teria realmente a necessidade de se declarar as váriaveis private e os métodos set e get ou poderia ser feito sem esse encapsulamento?

  2. Integer e nt são o mesmo tipo certo? Então eu poderia no lugar de Integer colocar int?

  3. Qual a diferença de se declarar um método como public e de se declarar sem o public? Testei aqui e funcionou do mesmo jeito. Quando não declaro um método como public que estado ele assume? Dá no mesmo?

Desculpa por essas dúvidas meio bestas…

Valeu quem puder ajudar!

Abraços!

R1: Suponha q a regra de negócio mudasse e agora uma pessoas só pudesse ter no máximo 100 anos no seu sistema. Vc alteraria apenas o set:

public void setIdade( Integer idade )  
    {  
        if( idade <= 100)
             this.idade = idade;    //dummy, mas é só de exemplo
    } 

ou seja, modificaria apenas aquilo que tem que ser modificado, e n precisaria mexer nenhuma outra classe q utilizava esse atributo. Imagine sem encapsulamento. Isso é um exemplo simples, tente imaginar com coisas mais complexas o trabalho que está sendo simplificado aqui.

R2: Sim, pode usar tanto um como outro. O Integer é a classe que representa um inteiro. o int é o tipo primitivo. Não há necessidade de utilizar Integer se vc não vai precisar dos métodos ou outros benefícios oferecidos pela utilização da classe ao invés do tipo primitivo. Mas poder, pode.

R3: É public por default, se vc n coloca nd o compilador considera como public. Porém sempre coloque, é uma boa prática deixar o código o mais claro possível.

[quote=rodpuc]
R3: É public por default, se vc n coloca nd o compilador considera como public. Porém sempre coloque, é uma boa prática deixar o código o mais claro possível.[/quote]

A visibilidade default é conhecida também como visibilidade de pacote, ou seja, apenas classes no mesmo pacote têm acesso.

[quote=alankelon][quote=rodpuc]
R3: É public por default, se vc n coloca nd o compilador considera como public. Porém sempre coloque, é uma boa prática deixar o código o mais claro possível.[/quote]

A visibilidade default é conhecida também como visibilidade de pacote, ou seja, apenas classes no mesmo pacote têm acesso.[/quote]

+1!
Sendo que a classe, só aceita dois modificadores referentes a acesso: public e default (quando se deixa em branco a visibilidade da classe)
E não referentes a acesso: abstract ou final e strictfp (os mais comuns).
ou = nunca combinados!
Flw!

tem razão, falha minha, o default é protected.

Shaft, funciona do msm jeito pq o protected dá visibilidade a classes do mesmo pacote e a subclasses.

[quote=rodpuc]tem razão, falha minha, o default é protected.

Shaft, funciona do msm jeito pq o protected dá visibilidade a classes do mesmo pacote e a subclasses.[/quote]

O default não é protected!
Membros default, podem ser acessados pelas classes somente do mesmo pacote; sendo através de herança ou referência.
Ao contrário dos membros protected, que podem ser acessados por classes fora ou dentro do pacote, mas em ambos, somente por herança e não por referência.
Flw!