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

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.

[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…

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

Poderia ser mais claro?

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); 
    }
} 

[quote=fabiozanardi][code]
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);
}
}

[/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.

[quote=fabiozanardi][code]
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);
}
}

[/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!

somente isso que quero.

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.

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.

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!

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.