O que é isso?

11 respostas
C

Prezados, boa noite.

Estou começando com Java, já tenho alguma experiencia com linguagem WEB(PHP e afins) e estou começando com JAVA agora. Em um dos meus cursos na faculdade estou desenvolvendo um programa que o professor passou a seguinte classe.

package classes;

import interfaces.Acao;
import interfaces.Estado;

public class No {
	
	private No pai;
	private Estado estado;
	private Acao acao;
	private int profundidade;
	private double custo;
	
	public No getPai() {
		return pai;
	}
	public void setPai(No pai) {
		this.pai = pai;
	}
	public Estado getEstado() {
		return estado;
	}
	public void setEstado(Estado estado) {
		this.estado = estado;
	}
	public Acao getAcao() {
		return acao;
	}
	public void setAcao(Acao acao) {
		this.acao = acao;
	}
	public int getProfundidade() {
		return profundidade;
	}
	public void setProfundidade(int profundidade) {
		this.profundidade = profundidade;
	}
	public double getCusto() {
		return custo;
	}
	public void setCusto(double custo) {
		this.custo = custo;
	}
	
}
A questão é, o que esta classe faz? Em outras classes existe algumas chamadas tipo
No n;
private double custo = n.getCusto();

Sendo que o getCusto() retorna apenas custo na classe No... ou seja, que diabos está acontecendo aqui? rsrs

Obrigado a quem puder me explicar!

11 Respostas

tondatto

Está classe não faz nada por si só.
Aparentemente é uma representação do de um Automato de Árvore.
Um tipo de máquina de estados.

P

no seu caso…
se tiver realmente como vc mostrou…
ele vai fará uma bela NullPointerException em:

n.getCusto();

mais nada… rs

Ruttmann

Recomendo a vc dar uma breve olhada em material de fundamentos Java, aprender sobre JavaBeans também…

Fica complicado te ajudar assim, apenas com uma classe, sem saber o enunciado da questão que o professor te passou também…

Qualquer dúvida dá um grito!

ralphsilver

Ruttmann:
Recomendo a vc dar uma breve olhada em material de fundamentos Java, aprender sobre JavaBeans também…

Fica complicado te ajudar assim, apenas com uma classe, sem saber o enunciado da questão que o professor te passou também…

Qualquer dúvida dá um grito!

Essa classe é o principio do Java Bean,

Tecnicamente ela serve apenas para armazenar conteúdos para usos em classes e/ou páginas.
Agora você precisa instanciar a classe para poder fazer uso dela…
No seu caso ele vai apitar nullPointerException… e erro de compilação pois se coloca private apenas em atributos de classe.
Tente

No n; n = new No(); double custo = n.getCusto();

double vai receber 0 (se não me engano)…

C

Senhores,

obrigado pelos comentários.

Porem a minha duvida não vem de como resolver o exercício… ou tudo mais… estou começando com Java agora e estou apanhando pra xuxu… mas enfim.

A minha duvida real é a seguinte.

Nesta classe, porque eu tenho estes vários métodos que retornam nada mais nada menos, por exemplo… este aqui

public Estado getEstado() { return estado; }
que valor é este estado que ele esta retornando??? De onde vem??

e outra… o que é isso?

public void setPai(No pai) {  
        this.pai = pai;  
    }

porque este método esta pegando o parâmetro pai e jogando para this.pai?? O que isso quer dizer??

Inté!

Ruttmann

cmdmss:
Senhores,

obrigado pelos comentários.

Porem a minha duvida não vem de como resolver o exercício… ou tudo mais… estou começando com Java agora e estou apanhando pra xuxu… mas enfim.

A minha duvida real é a seguinte.

Nesta classe, porque eu tenho estes vários métodos que retornam nada mais nada menos, por exemplo… este aqui

public Estado getEstado() { return estado; }
que valor é este estado que ele esta retornando??? De onde vem??

e outra… o que é isso?

public void setPai(No pai) {  
        this.pai = pai;  
    }

porque este método esta pegando o parâmetro pai e jogando para this.pai?? O que isso quer dizer??

Inté!

Certo, vamos lá…

Existe uma especificação da plataforma Java chamada JavaBeans, que nada mais é que um “guia” de boas práticas para programação…

Essa classe que você apresentou é um Bean, uma classe que segue certas especificações JavaBeans…

No caso de um padrão MVC(Model, View e Controller) essa classe se encaixaria como Model(se você estudar este padrão de projeto vai entender do que falo, é um conceito relativamente fácil, tem a ver com a arquitetura)…

Os atributos da sua classe estão todos declarados como private e sendo assim, só são acessíveis para métodos que estão dentro da mesma classe. Outras classes não tem acesso direto aos atributos, não podendo consultar seus valores e muito menos alterá-los. Isso se chama encapsulamento, e é assim que garantimos a integridade dos atributos dos objetos. Caso você tivesse declarado estes atributos como public, os mesmos seriam acessíveis a qualquer classe.

E os métodos get e set servem basicamente para alterar os atributos de maneira segura, garantindo a consistência dos dados contidos nos atributos da classe em questão.

Por fim, o this serve para você se referenciar à variável pai no escopo da classe. Pois ao criar este método setPai, você definiu uma variável pai que só será vista no escopo deste método, ela só irá existir enquanto este método estiver rodando, e logo após o final da execução do mesmo, ela morre.

Ou seja, digamos que de fora da sua classe No você quer “setar” o atributo pai desta mesma classe. Para isso você acessa o método setPai, passando no parâmetro do método um objeto do mesmo tipo do atributo que você precisa setar. Na linha this.pai = pai; ele diz que o atributo que você passou ao método(que no caso seria o pai após o sinal de igual) será alocado no pai da classe apontado pelo comando this.pai.

Resumindo: O this é usado para se referir a atributos de escopo geral, atributos que estejam num escopo mais abrangente que apenas o método…

Recomendo a você estudar fundamentos da orientação a objetos, modificadores de acesso e especificação JavaBeans. É o básico do básico pra você começar a desenvolver em Java.

:wink:

SierraEx

cmdmss:
Senhores,

obrigado pelos comentários.

Porem a minha duvida não vem de como resolver o exercício… ou tudo mais… estou começando com Java agora e estou apanhando pra xuxu… mas enfim.

A minha duvida real é a seguinte.

Nesta classe, porque eu tenho estes vários métodos que retornam nada mais nada menos, por exemplo… este aqui

public Estado getEstado() { return estado; }
que valor é este estado que ele esta retornando??? De onde vem??

e outra… o que é isso?

public void setPai(No pai) {  
        this.pai = pai;  
    }

porque este método esta pegando o parâmetro pai e jogando para this.pai?? O que isso quer dizer??

Inté!

Bom dia cmdmss

Isto se trata de encapsulamento, encapsulamento significa, de maneira resumida, proteger as propriedades de uma classe atribuindo um modificador de acesso privado(private) e acessar estas propriedades através de métodos públicos(public).

Por exemplo:

public Estado getEstado() {
             return estado;
         }

Signfica que você possui uma propriedade do tipo estado (neste caso específico, você tem uma classe Estado, uma classe, também de maneira resumida, é uma concepção de algo do mundo real em computação, que possui propriedades e comportamentos, sendo neste caso as propriedades representadas pelas variáveis e os comportamentos pelos métodos, para uma definição mais precisa sugiro pesquisar sobre os princípios da orientação a objetos), e utilizará o método getEstado() para retornar a variável estado do objeto do tipo No, por isso está escrito public Estado getEstado(), ou seja, é um método público(pode ser acessado fora da classe por um objeto da classe No) e quando utilizado retornará o objeto do tipo Estado que “está dentro” do objeto do tipo No.

Já essa linha:

public void setEstado(Estado estado) {
             this.estado = estado;
         }

Significa que, quando setEstado() for invocado em um objeto do tipo No, ele irá receber um Estado e atribuirá este estado(variável estado) para a variável de estado do objeto No(this.estado), a palavra this é utilizada para indicar que você está utilizando variáveis e métodos da classe(tem mais coisas que isso, mas por enquanto…), this.estado é a variável do objeto, enquanto estado é a variável que você recebeu por parâmetro.

Em uma classe teste você poderia testar assim:

public class Teste {
                  public static void main(String[] args) {
                       
                            No no = new No(); //crio um novo objeto to tipo No e passo a referenciá-lo na variável no

                            no.setEstado(new Estado()); //Crio um novo estado e atribuo a no, repare no new Estado() sendo passado como argumento
                            
                            Estado estado = no.getEstado(); //Crio uma variável do tipo estado e essa variável vai receber o estado da variável no 

                  }
          }

No princípio é um pouco complicado, pois você está começando, qualquer dúvida estamos aí

S

Só para completar o que Ruttmann disse:

o this também é usado no metodo construtor para chamar um outro metodo construtor da mesma classe.

Exemplo:

class A {

	private int a;
	private int b;

	public A() {
		setA(10);
	}

	public A(int b) {
		this();
		setB(b);
                //se o this entrar aqui ou em qualquer outro lugar da erro de compilação
	}

	public int getB() {
		return b;
	}

	public void setB(int b) {
		this.b = b;
	}

	public int getA() {
		return a;
	}

	public void setA(int a) {
		this.a = a;
	}

}

Lembrando que quando for fazer isso o this deve SEMPRE estar logo após a declaração do metodo construtor.

Ziru
cmdmss:
Senhores,

obrigado pelos comentários.

Porem a minha duvida não vem de como resolver o exercício... ou tudo mais... estou começando com Java agora e estou apanhando pra xuxu... mas enfim.

A minha duvida real é a seguinte.

Nesta classe, porque eu tenho estes vários métodos que retornam nada mais nada menos, por exemplo... este aqui

public Estado getEstado() {  
        return estado;  
    }
que valor é este estado que ele esta retornando??? De onde vem?? e outra... o que é isso?
public void setPai(No pai) {  
        this.pai = pai;  
    }
porque este método esta pegando o parâmetro pai e jogando para this.pai?? O que isso quer dizer??

Inté!

Isso se chama encapsulamento. Quando se declara atributos como private somente essa classe pode velos, ou modificalos. Então como fazer para manipular esses dados se outra classe não tem acesso? Isso se dá pelos métodos gtters e setters. O metodo get retorna o valor do atributo. E o set modifica esse valor.
//Partindo de um principio simples de uma aplicação bancaria temos a classe.

public class ContaBancaria {

	 double saldo; //atributo não declarado como private
	
}

Veja que no ponto inicial da aplicação eu posso modificar agora diretamente o saldo da conta.

public class Aplicação {

	public static void main(String[] args) {
		
		ContaBancaria  conta = new ContaBancaria();
		
		conta.saldo = 1000;

	}

}

Quando eu declarar o atributo saldo como private, o código não irá mais compilar. Pois o mesmo se torna privado e nenhuma outra classe tem acesso a ele.
O acesso a esse atributo só é feito a partir de método.
No caso de uma aplicação bancaria não seria interessante os cliente mudarem seu saldo diretamente, e como declaramos o saldo como privado isso não irá ocorrer.
Para mudar o valor de saldo precisa de um metodo, pode ser ele um setSaldo, ou melhor ainda um metodo que irá receber um valor de outra pessoa e atribuir a esse saldo, que no caso seria um metodo depositar.

Nessa nossa simples aplicação podemos utilizar o gtSaldo para ver quanto de soldo essa conta tem.
vou colocar os dois métodos para explicar o uso do this

public double getSaldo() {
		return saldo; // este método irá apenas mostrar o valor do saldo
	}

	public void setSaldo(double saldo) {
		this.saldo = saldo; /* 
	   o "this.saldo = saldo" está disendo pegue o valor de saldo passado no parametro do metodos e atribua a this.saldo ou seja o valor do atributo saldo.
	   this é usado para referenciar um atributo, pois se não fosse assim o java não entenderia qual valor deveria ir para qual lugar.
	 */
	}

Bem espero ter ajudado.
E recomendo que estude sobre o encapsulamento.

C

Ok senhores!

Muito boas as explicações… agora eu acho que estou entendendo! rsrs… entendi todos os comentários aqui escrito… agora vou aplica-los e ver se oq eu entendi está mesmo de fato correto!

Se eu tiver duvidas, deixo vocês saberem!

Valeu a todos.

Abraços.

raffamz

paulovloghan:
no seu caso…
se tiver realmente como vc mostrou…
ele vai fará uma bela NullPointerException em:

n.getCusto();

mais nada… rs

Faltou o =new No();

eu acho!?! Haha

Criado 11 de setembro de 2012
Ultima resposta 13 de set. de 2012
Respostas 11
Participantes 9