Dúvida POO

pessoal, eu fiquei com uma dúvida num negocio aqui.

eu tenho uma classe produto que é abstrata e outras 2 classes, motor e parafuso que herdam de produto. daí eu tenho um repositorio que armazena produtos, a pergunta é: como sei se determinado produto cadastrado é um motor ou um parafuso?

Classe produto

public abstract class Produto {

	private int codigo;
	private String nome;
	private double valor;
	private double potencia;
	private double corrente;
	private int rpm;
	private double comprimento;
	private double diametro;
	
	public int getCodigo() {
		return codigo;
	}

	public void setCodigo(int codigo) {
		this.codigo = codigo;
	}

	public String getNome() {
		return nome;
	}

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

	public double getValor() {
		return valor;
	}

Motor

public class Motor extends Produto {
	
	private double valor;
	private double potencia;
	private int rpm;
	
	public double getValor() {
		return valor;
	}

	public void setValor(double valor) {
		this.valor = valor;
	}

	public double getPotencia() {
		return potencia;
	}

	public void setPotencia(double potencia) {
		this.potencia = potencia;
	}

	public int getRpm() {
		return rpm;
	}

	public void setRpm(int rpm) {
		this.rpm = rpm;
	}

	@Override
	public double valorEmEstoque() {
		return 2 * potencia + rpm * valor;
	}
}

Parafuso

public class Motor extends Produto {
	
	private double valor;
	private double potencia;
	private int rpm;
	
	public double getValor() {
		return valor;
	}

	public void setValor(double valor) {
		this.valor = valor;
	}
	
	public double getPotencia() {
		return potencia;
	}

    public void setPotencia(double potencia) {
		this.potencia = potencia;
	}

	public int getRpm() {
		return rpm;
	}
	
	public void setRpm(int rpm) {
		this.rpm = rpm;
	}

	@Override
	public double valorEmEstoque() {
		return 2 * potencia + rpm * valor;
	}
}

Repositorio

public class RepositorioArray {
	
	Produto[] produtos;
	
	RepositorioArray() {
		this.produtos = new Produto[5];
	}
	
	public void inserir(Produto produto) {
		for(int i = 0; i < produtos.length;) {
			if(produtos[i] == null) {
				produtos[i] = produto;
			}
		}
		
		System.out.println("não foi possível inserir o produto. ");
	}
	
	public void remover(int codigo) {
		for(int i = 0; i < produtos.length; i++) {
			if(produtos[i].getCodigo() == codigo) {
				produtos[i] = null;
			}    
		}
		
		System.out.println("codigo não encontrado");
	}

vamos supor que eu quero criar um metodo valorEmEstoque
sendo que o valor de um parafuso é diferente de um motor, como eu faria esse metodo??

Você postou a classe Motor duas vezes.
Em geral, você define um tipificador que irá determinar se o objeto é um deste, daquele ou daquele outro.

não percebi

classe parafuso

ublic class Parafuso extends Produto {

private double valor;
private double comprimento;




public Parafuso(double valor, double comprimento) {
	super();
	this.valor = valor;
	this.comprimento = comprimento;
}




public double getValor() {
	return valor;
}




public void setValor(double valor) {
	this.valor = valor;
}





public double getComprimento() {
	return comprimento;
}




public void setComprimento(double comprimento) {
	this.comprimento = comprimento;
}




@Override
public double valorEmEstoque() {
	
	return comprimento*valor;
}

}

qual seria??

Acho que você não leu minha resposta completa.

não sei se entendi correto, mas no caso eu criaria uma variavel motor do tipo motor e uma parafuso do tipo Parafuso e verificaria se o produto é igual a motor ou parafuso, é isso?

Não é comum você ter vários produtos sem uma tipificação.
Considerando este cenário específico, eu criaria um enum

public enum TipoProduto {
    MOTOR, PARAFUSO, COXIM //...
}

E definiria uma propriedade na classe Produto, considerando o enum TipoProduto

vc pode fazer um if instanceof entre duas instancias dos objetos, por exemplo:

    Produto p1 = new Parafuso();
    Produto p2 = new Moto();
    if(p1 instanceof p2) {
        System.out.prinln("p1 é do mesmo tipo de p2");
    }

mas eu teria que fazer essa verificação no repositorio e não na classe main

tipo, eu preciso fazer um metodo que calcule o valor de estoque de um produto e lá preciso fazer a verificação se um produto é motor ou parafuso

Faz mais sentido criar categorias do que classes para cada produto.
Imagine que com o sucesso sua aplicação tenha milhares de produtos, seria inviável ter uma classe para cada produto.

Então vc poderia ter por exemplo a categoria carro e a subcategoria motor.
A categoria moto e a subcategoria motor.

Teria a classe produto, mas não teria a classe motor.

Teria a subcategoria pneus, mas não a classe pneu.

É a ficha técnica poderia ser representada por um Map<String, String>, ou um JsonObject

Isso permite a implementação de filtro por categoria, preço, etc.

Exemplo

table produto(
   id,
   nome,
   preço,
   quantidade,
   --etc
);

table categoria(
    id,
    nome
)

table sub_categoria(
    id,
    id_categoria, -- adicionar a chave estrangeira(fk)
    nome
);

table categoria_produto(
    id,
    id_produto,-- add fk
    id_categoria -- add fk
);

table subcategoria_produto(
    id,
    id_subcategoria, --add fk
    id_produto --add fk
);

table ficha_tecnica_produto(
    id_produto, --add fk
    json-- ficha técnica do produto, sendo possível realizar comparações entre produtos com a manipulação do json
);

A ficha técnica pode ser um form qualquer, cujos dados serão salvos no db na tabela correspondente.

Não acho produtivo uma tabela como:

table ficha_tecnica_produto(
    id,
    id_produto,
    chave,
    valor
);

Isto porque a ficha técnica ficaria fragmentada em muitas partes, “inchando” a relação e por consequência aumentando as operações de consulta.

Faz um SELECT que traga o produto e sua categoria (ou subcategoria conforme a implementação), assim vc implementa um objeto do tipo produto, que possui uma categoria e uma lista de subcategorias + a ficha técnica.

Na tabela produto, adiciona a coluna tipo_produto, recebendo o tipo do produto, seja ele motor ou parafuso, etc.