Criticas/Dicas para o codigo e sua refratoraçao

Gostaria que me dessem dicas para melhorar o seguinte codigo, tal como para nao repetir o mesmo codigo em todos os valores da enum. Penso que receber dicas me ajudará a melhorar. Obrigado

public enum Tarifas {

JANEIRO(30, 2.5, 5) {
	@Override
	public BigDecimal getPreco(int pax, String entrada, String saida, String APT) {
		int diaEntrada = Integer.parseInt(entrada.substring(0, 2));
		int diaSaida = Integer.parseInt(saida.substring(0, 2));
		BigDecimal paxDecimal = getPaxDecimal(pax, APT);
		BigDecimal preco = new BigDecimal(getPrecoInicial());
		final BigDecimal ADD = new BigDecimal(getPessoaAlteracao());
		BigDecimal addT2 = new BigDecimal(0);
		if (APT == "T2"){
			addT2 = new BigDecimal(getPessoaAlteracao());
		}
		
		preco = preco.add((addT2.add(paxDecimal.multiply(ADD))));
		preco = preco.multiply(new BigDecimal(diaSaida-diaEntrada));
		
		return preco;
	}
}
, FEVEREIRO(30, 2.5, 5) {
	@Override
	public BigDecimal getPreco(int pax, String entrada, String saida, String APT) {
		int diaEntrada = Integer.parseInt(entrada.substring(0, 2));
		int diaSaida = Integer.parseInt(saida.substring(0, 2));
		BigDecimal paxDecimal = getPaxDecimal(pax, APT);
		BigDecimal preco = new BigDecimal(getPrecoInicial());
		final BigDecimal ADD = new BigDecimal(getPessoaAlteracao());
		BigDecimal addT2 = new BigDecimal(0);
		if (APT == "T2"){
			addT2 = new BigDecimal(getPessoaAlteracao());
		}
		
		preco = preco.add((addT2.add(paxDecimal.multiply(ADD))));
		preco = preco.multiply(new BigDecimal(diaSaida-diaEntrada));
		
		return preco;
	}
}, MARÇO(30, 2.5, 5) {
	@Override
	public BigDecimal getPreco(int pax, String entrada, String saida, String APT) {
		return null;
	}
}, ABRIL(35, 2.5, 5) {
	@Override
	public BigDecimal getPreco(int pax, String entrada, String saida, String APT) {
		return null;
	}
}, MAIO(35, 2.5, 5) {
	@Override
	public BigDecimal getPreco(int pax, String entrada, String saida, String APT) {
		return null;
	}
}, JUNHO(2,2,2) {
	@Override
	public BigDecimal getPreco(int pax, String entrada, String saida, String APT) {
		return null;
	}
}, JULHO(37.5, 5,5) {//ALTERAR
	@Override
	public BigDecimal getPreco(int pax, String entrada, String saida, String APT) {
		return null;
	}
}, AGOSTO(2,2,2) {//ALTERAR
	@Override
	public BigDecimal getPreco(int pax, String entrada, String saida, String APT) {
		return null;
	}
}, SETEMBRO(2,2,2) {//ALTERAR
	@Override
	public BigDecimal getPreco(int pax, String entrada, String saida, String APT) {
		return null;
	}
}, OUTUBRO(35, 2.5, 5) {
	@Override
	public BigDecimal getPreco(int pax, String entrada, String saida, String APT) {
		return null;
	}
}, NOVEMBRO(30, 2.5, 5) {
	@Override
	public BigDecimal getPreco(int pax, String entrada, String saida, String APT) {
		return null;
	}
}, DEZEMBRO(30, 2.5, 5) {
	@Override
	public BigDecimal getPreco(int pax, String entrada, String saida, String APT) {
		return null;
	}
};

private double precoInicial;
private double pessoaAlteracao;
private double TAlteracao;

private Tarifas(double precoInicial, double pessoa, double alteracao) {
	this.precoInicial = precoInicial;
	this.pessoaAlteracao = pessoa;
	this.TAlteracao = alteracao;
}

public static int getMesNum(Tarifas mes){
	return mes.ordinal();
}

public static String getMes(int i){
	return Tarifas.values()[i].name();
}

public abstract BigDecimal getPreco(int pax, String entrada, String saida, String APT);

public static BigDecimal getPrecoMes(int mes, int pax, String entrada, String saida, String APT){
	int entradaMes = Integer.parseInt(entrada.substring(3,5));
	int saidaMes = Integer.parseInt(saida.substring(3,5));
	
	if (entradaMes == saidaMes){
		return Tarifas.values()[mes-1].getPreco(pax, entrada, saida, APT);
	}else{
		System.out.println("Dif");
		Calendar cal = Calendar.getInstance();
		int diaMax = cal.getActualMaximum(entradaMes);
		saida = diaMax + "/" + entradaMes + "/" + entrada.substring(6,10);
		BigDecimal preco1 = Tarifas.values()[mes-1].getPreco(pax, entrada, saida, APT);
		
		entrada = 1 + "/" + saidaMes + "/" + entrada.substring(6,10);
		BigDecimal preco2 = Tarifas.values()[mes-1].getPreco(pax, entrada, saida, APT);
		return preco1.add(preco2);
	}
}

private static BigDecimal getPaxDecimal(int pax, String apt) {
	if (apt == "T1"){
		if (pax < 2){
			pax = 2;
		}
	}else{
		if (pax < 4){
			pax = 4;
		}
	}
	
	pax -=1;
	
	BigDecimal paxDecimal = new BigDecimal(pax);
	return paxDecimal;
}

//GETTERS AND SETTERS

}

PS: O metodo getPrecoMes é provisorio

Oi vc pode utilizar o padrão strategy que consiste em criar uma interface e retornar uma implementação para cada enum.
Ex:

public interface PrecoMes{
    public BigDecimal getPreco(int pax, String entrada, String saida, String APT);
}

No enum vc faz:

public enum Tarifas {
    
     JANEIRO(30, 2.5, 5) {
@Override
public PrecoMes getPreco(){
          return new PrecoJaneiro();//Implementação para janeiro, class concreta.
}
}
}
1 curtida

Não entendi muito bem. Vou ter que criar uma classe concreta que implemente a interface PrecoMes para todos os meses?

Não use enum. Crie uma classe com os atributos necessários e 1 método.

Não sei em que material de estudo está se baseando pra fazer dessa forma, mas aconselho seguir a apostila da caelum de java e orientacao a objetos.

Estou me baseando nos meus poucos conhecimentos… Não estou vendo como fazer isto em uma classe sem usar um monte de ifs, pode dar um exemplo por favor?

Qual monte de ifs? Seja mais específico.

Penso que vou ter que fazer um if para cada enum

Mas o que faz esse if? Dê pelo menos dois exemplos.

Ah já entendi o que você queria dizer, Obrigado!

Oi, Fiz um video sitando sua duvida e esplicando sobre o padrão strategy.
Nesse link: