Orientação/Ajuda com pacotes, getters e setters

14 respostas
jkrfabio

Olá pessoal,

EStou com certa dificuldade em conseguir fazer algo, abaixo os códigos e irei explicar cada um deles.

Aqui tenho meu pacote model e minha classe produto com seus getters e setters.

package model;

public class Produto 
{
	private int estoque;
	private int repor;
	
	public void setEstoque(int estoque)
	{
		this.estoque = estoque;
	}
	
	public void setRepor(int repor)
	{
		this.repor = repor;
	}
	
	public int getEstoque()
	{
		return this.estoque;
	}
	
	public int getRepor()
	{
		return this.repor;
	}
}

Abaixo tenho meu outro pacote service, e dentro do mesmo uma classe e um método
esse método eu passo como parâmetro o quantidade de produtos a serem vendidos,
porém preciso "dizer" a este método que aquele int estoque da classe Produto vai ser igual a ele menos a quantidade que passei como parâmetro.

package service;

import model.Produto;

public class ProdutoService
{
	
	public void venderProduto(int quantidade)
	{
		
	}

        /* exemplo de como deveria ser
public void venderProduto(int quantidade)
	{
		this.estoque-=quantidade;
	}*/
}

A ajuda é a seguinte, como eu pego a variável estoque da classe Produto e uso dentro deste método venderProduto?

14 Respostas

drsmachado

Sem que o ProdutoService conheça o objeto produto em questão, não é possível.
Pense no seguinte, como um banco sabe que o João da Silva sacou R$ 200 de sua conta? Como o banco não se confunde, afinal, são muitos que se chamam João da Silva…

jkrfabio

Não sei.
Imaginava que era só importar a classe e estava tudo ok.

Poderia ser mais claro?

drsmachado

Você precisa passar o Produto que deseja vender ou uma forma de identificação, para que a classe ProdutoService tenha ação.
Seguindo com o exemplo do João da Silva e do banco. O banco sabe qual foi o João da Silva não pelo nome, mas pelos dados da conta, agência e demais detalhes, como os contidos no cartão de débito.
Neste caso, é a mesma coisa. Sem saber qual o produto (ou seja, sem ter a instância do objeto produto), você nunca vai conseguir alterar o atributo estoque.

fabiozanardi
package service;  
  
import model.Produto;  
  
public class ProdutoService  
{  
      
   Produto produto = new Produto(); // instanciar um produto novo aqui

    public void venderProduto(int quantidade)  
    {  
          
    }  
  

public void venderProduto(int quantidade) 
    { 
        int total = Produto.getEstoque() - quantidade; // subtraia da quantidade em estoque
        Produto.setEstoque(total); 
    }
}
drsmachado
fabiozanardi:
package service;  
  
import model.Produto;  
  
public class ProdutoService  
{  
      
   Produto produto = new Produto(); // instanciar um produto novo aqui

    public void venderProduto(int quantidade)  
    {  
          
    }  
  

public void venderProduto(int quantidade) 
    { 
        int total = Produto.getEstoque() - quantidade; // subtraia da quantidade em estoque
        Produto.setEstoque(total); 
    }
}
Isto não funcionaria. Vamos supor que ele possua 2 produtos cadastrados no estoque, "a" e "b", com 3 e 10 unidades respectivamente. De qual dos dois ele estaria fazendo a subtração, segundo o que você postou?

Ou você passa qual é o produto ou mantém a referência dele para conhecimento do teu ProdutoService, sem isso, não funciona.

jkrfabio
fabiozanardi:
package service;  
  
import model.Produto;  
  
public class ProdutoService  
{  
      
   Produto produto = new Produto(); // instanciar um produto novo aqui

    public void venderProduto(int quantidade)  
    {  
          
    }  
  

public void venderProduto(int quantidade) 
    { 
        int total = Produto.getEstoque() - quantidade; // subtraia da quantidade em estoque
        Produto.setEstoque(total); 
    }
}

Fábio, está dando erro.

Tenho que mudar algo também na classe Produto? Pois está pedindo para mudar o modificador do getEstoque para static
mas mudando para static gera um outro erro.

jkrfabio

Vamos supor que eu tenha somente o produto A
e que eu tivesse de estoque 10
e no método venderProduto diria a ele para descontar por exemplo vendi 5, o estoque deverá conter somente mais 5!

somente isso que quero.

sergiotaborda
jkrfabio:
Abaixo tenho meu outro pacote service, e dentro do mesmo uma classe e um método esse método eu passo como parâmetro o quantidade de produtos a serem vendidos,

Sim, mas vc não passa qual é o produto a ser vendido. Como vc quer que o método saiba qual é o produto ? Adivinhe ?
Já lhe disseram a resposta : passe o produto no método

package service;

import model.Produto;

public class ProdutoService
{
	
	public void venderProduto(int quantidade , Produto produto)
	{
		int estoque = obtemEstoque(produto);
                int novoEstoque = estoque - quantidade;
                attribuiEstoque(produto, novoEstoque);
	}

}

É claro que vai ter que obter o estoque atual de alguma forma e depois atualizar o estoque com o novo valor. Usei métodos para vc entender o algoritmo, vc implementa como quiser.

drsmachado

jkrfabio:
Vamos supor que eu tenha somente o produto A
e que eu tivesse de estoque 10
e no método venderProduto diria a ele para descontar por exemplo vendi 5, o estoque deverá conter somente mais 5!

somente isso que quero.


Na verdade, o que você quer é uma resposta pronta.
Esqueça isso, não se iluda, tampouco faça os foristas perderem tempo.
Mostre o que fez, qual a dúvida e aprenda que perguntar é esperar respostas, não que façam o que você quer.

fabiozanardi

eu apenas dei um exemplo de como acessar o get e o set do produto que ele não estava sabendo fazer, obvio que somente assim nada iria funcionar.

alberthy

Se você pegar qualquer apostila na internet com relação a Java Básico, você irá encontra algo a respeito.

Aposto que é trabalho de faculdade!

Abraço!

jkrfabio

Pessoal consegui resolver com a ajuda de vocês! Acrescentei um método para imprimir os estoques.

package service;

import model.Produto;

public class ProdutoService
{
	public void venderProduto()
	{
		Produto b = new Produto();
 		
 		b.setEstoque(10);
 		b.setqtdVenda(2);
 		b.setnovoEstoque((b.getEstoque()-b.getqtdVenda()));
 		
	}
	
	public void imprimirEstoques(Produto b)
	{
		System.out.println("Estoque atual "+b.getEstoque());
		System.out.println("Estoque após venda "+b.getnovoEstoque());
	}
}

Até aí tudo ok, porém tenho uma outra classe somente com o Main em que eu deveria dizer para ele inicar o venderProduto e abaixo imprimirEstoques
mais ou menos assim:

package view;

import model.Produto;
import service.ProdutoService;

public class InterfacePrincipal 

{
	public static void main(String[] args) 
	{
		b.venderProduto();
		b.imprimirEstoques();
	}
}

Obviamente isto não está funcionando, poderiam dizer o que está faltando? Tento passar Produto b como parâmetro mas ele não aceita.

n1ls0n
jkrfabio:
Pessoal consegui resolver com a ajuda de vocês! Acrescentei um método para imprimir os estoques.
package service;

import model.Produto;

public class ProdutoService
{
	public void venderProduto()
	{
		Produto b = new Produto();
 		
 		b.setEstoque(10);
 		b.setqtdVenda(2);
 		b.setnovoEstoque((b.getEstoque()-b.getqtdVenda()));
 		
	}
	
	public void imprimirEstoques(Produto b)
	{
		System.out.println("Estoque atual "+b.getEstoque());
		System.out.println("Estoque após venda "+b.getnovoEstoque());
	}
}

Até aí tudo ok, porém tenho uma outra classe somente com o Main em que eu deveria dizer para ele inicar o venderProduto e abaixo imprimirEstoques
mais ou menos assim:

package view;

import model.Produto;
import service.ProdutoService;

public class InterfacePrincipal 

{
	public static void main(String[] args) 
	{
		b.venderProduto();
		b.imprimirEstoques();
	}
}

Obviamente isto não está funcionando, poderiam dizer o que está faltando? Tento passar Produto b como parâmetro mas ele não aceita.

No caso você terá que instanciar a classe que pretende usar os métodos ou coloca estes métodos como "static" e chamá-los diretamente com a classe.

sergiotaborda

Na boa. Vc tem problemas sérios de conceito de como funciona um sistema OO. Vc quer vender produtos sem os identificar ?
O que lhe dissemos é que o método vender tem que receber o produto. Não é o método que decide o produto a ser vendido.

O codigo ficaria mais ou menos assim:

package service;

import model.Produto;

public class ProdutoService
{

      // o estoque não fica no produto. é um contador à parte.
      // aqui estou usando um mapa, mas num sistema real teriamos uma entidade Estoque e um banco de dados.
      // vamos supor que este mapa foi iniciado com 100 quantidades para cada produto
        private Map<Produto, Integer> estoque = new HashMap<Produto, Integer>();

	public void vende(int quantidade, Produto produto)
	{

               Integer quantidadeAtual = estoque.get(produto);

               Integer quantidadeFinal = quantidadeAtual  - quantidade;

                estoque.put(produto, quantidadeFinal );
 	
                System.out.println("Estoque atual "+quantidadeAtual );
		System.out.println("Estoque após venda "+quantidadeFinal );	
	}
	
}

public class InterfacePrincipal 

{
	public static void main(String[] args) 
	{
		// vc precisa do service, primeiro
               ProdutoService service = new ProdutoService();

              // precisa identificar o produto. Aqui estou usando um string de nome, mas no mundo real seria o id do banco
              Produto laranjas = new Produto("laranjas");
                
              // invoca o serviço para realizar a venda.
              service.vende( 8 , laranjas);
 
              // e agora com bananas
              Produto bananas= new Produto("bananas");
                
               service.vende( 5 , bananas);


	}
}

veja que a informação de quanto é vendido e qual o produto vem de fora do servico. Por isso que ele se chama serviço , ele serve a alguém. No caso o método main.
O serviço não pode decidir o produto, como no seu codigo onde o serviço da new no produto. Isso não faz sentido.

Espero que com este exemplo entenda melhor como funciona o fluxo e como se usam os objetos.

Criado 31 de janeiro de 2013
Ultima resposta 2 de fev. de 2013
Respostas 14
Participantes 6