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.
[code]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;
}
}
[/code]
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.
[code]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;
}*/
}
[/code]
A ajuda é a seguinte, como eu pego a variável estoque da classe Produto e uso dentro deste método venderProduto?
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…
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.
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);
}
}
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);
}
}
[/code][/quote]
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.
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);
}
}
[/code][/quote]
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.
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!
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
[code]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);
}
}
[/code]
É 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.
[quote=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.[/quote]
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.
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());
}
}[/code]
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:
[code]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.
[quote=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());
}
}[/code]
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:
[code]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.
[/quote]
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.
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.