Qual amelhor forma de fazer isso

Bom dia pessoal!

Estou tentando responder um exercício simples, e me deparei com a seguinte contrução:

auto1.setTipoCombustivel(auto1.GASOLINA);				

ou

auto1.setTipoCombustivel(auto1.combustivel.GASOLINA);	

Qual a melhor forma de implementar? O tipo de combustivel tem estar limtado a três opções: GASOLINA, ALCOOL ou FLEX. Entao pensei em criar uma classe que contivesse estas constantes. Toda vez que eu tiver que limitar as minhas opções terei que criar uma classe só com este objetivo?

No meu exercício criei:

na classe Combustivel fiz
public static final String GASOLINA = "GASOLINA"; public static final String ALCOOL = "ALCOOL"; public static final String FLEX = "FLEX";

na classe Automovel
Combustivel combustivel = new Combustivel();

na classe TesteAutomovel

      Automovel auto1 = new Automovel();

De uma pesquisada sobre enums… sao muito uteis :wink:

use enums

para seu problema seria mais ou menos assim:

public enum Combustivel {GASOLINA, ALCOOL, FLEX }//isso pode ficar dentro de uma classe ou fora de qualquer classe.
como por exemplo.

public class Automovel{
        public enum Combustivel {GASOLINA, ALCOOL, FLEX }
}

para acessar esses valores seria Automovel.Combustivel.GASOLINA; por exemplo… GASOLINA, ALCOOL e FLEX são do tipo Combustível, então basta você criar uma váriavel deste tipo para armazená-los.

public class Automovel{
        public enum Combustivel {GASOLINA, ALCOOL, FLEX }
        
       private Combustivel tipoCombustivel;
}

os enums só funcionam a partir do Java 1.5 …

eu recomendo que vc dê uma estudadinha neles… é muito interessante… e serve direitinho para o que você tá tentando fazer…

Valeu pela atenção de vocês!

viniciuslaine:

Estou tentando usar o enum em Automovel, e ela nao possui o o metodo “main”!

Por isso ao fazer:

“Combustivel. "
// o Eclplise informa: " No Default Proposals”

ou

“Automovel.Combustivel. "
//o Eclplise informa: " No Default Proposals”

O que fazer para o enum ser visivel na classe Automovel?

Grato pela atenção de vocês!

[quote=tct9]Valeu pela atenção de vocês!

viniciuslaine:

Estou tentando usar o enum em Automovel, e ela nao possui o o metodo “main”!

Por isso ao fazer:

“Combustivel. "
// o Eclplise informa: " No Default Proposals”

ou

“Automovel.Combustivel. "
//o Eclplise informa: " No Default Proposals”

O que fazer para o enum ser visivel na classe Automovel?

Grato pela atenção de vocês![/quote]

se vc colocar :

public enum Combustivel {BLA, BLA, BLA}

ele fica sendo visivel pra quem enchergar a classe em q ele está contido…
ou voce pode colocar ele de fora de uma classe também, porque o enum é mais ou menos uma classe… mas se você colocar de fora ela não pode ser public… então melhor colocar dentro de sua classe Automovel mesmo e manter a notação public. Mantendo-a public ela deve ser vista por quem enchergar sua classe… que suponho que também seja public… se não for coloque-a public…

E verifique a versão de sua JDK… o enum só funciona a partir (incluindo) do JDK 1.5…

se ainda não funcionar posta o codigo que você está tentando aqui pra gente ver se tem algum erro…

espero ter ajudado… T+

O problema a ser resolvido era este:

Criar uma classe em Java que represente um automóvel. É importante guardar o tipo de combustível que ele utiliza (podendo ser gasolina, álcool, ou flex), o fabricante, o ano e o modelo. Será necessário calcular a quantidade de combustível necessária para percorrer determinado percurso sabendo-se que: automóvel a álcool faz 15 km/l e automóvel a gasolina faz 12 km/l. Para aqueles com tipo de combustível flex considerar metade do caminho como gasolina e a outra metade como álcool.

Criei a classe Automovel e a classe enum Combustivel.

Como retirar as exclamações abaixo do meu codigo?!

[code]package exercio1;

public class Automovel {

private String tipoCombustivel;	
private String fabricante = ""; //exclamação: The field Automovel.fabricante is never ready locally
private int ano = 0;			//exclamação: The field Automovel.ano is never ready locally
private String modelo ="";		//exclamação: The field Automovel.modelo is never ready locally

public Combustivel combustivel;

//distancia: em km's
//retorna a quantidade de combustivel gasto
public double qtdCombustivel(double distancia){			
	//exclamação: the static method valueOf(String) from the type Combustivel should be accessed in a static way
	return combustivel.valueOf(tipoCombustivel).rendimento() * distancia;
	//Funciona destes dois modos.. por que?
   //return Combustivel.valueOf(tipoCombustivel).rendimento() * distancia;		
}

public void setTipoCombustivel(String tipoCombustivel) {
	this.tipoCombustivel = tipoCombustivel;
}

public void setFabricante(String fabricante) {
	this.fabricante = fabricante;
}

public void setAno(int ano) {
	this.ano = ano;
}

public void setModelo(String modelo) {
	this.modelo = modelo;
}

}[/code]

a outra classe:

[code]package exercio1;

public enum Combustivel {

GASOLINA(1.0/12.0), //rendimento de 12km/l
ALCOOL(1.0/15.0),	//rendimento de 15km/l
FLEX(3.0/40.0);		//rendimento de 13.33km/l

private final double rendimento;

Combustivel(double rendimento){
	this.rendimento = rendimento;
}

public double rendimento(){
	return rendimento;
}

}[/code]

finalmente a classe de Teste:

[code]package exercio1;

public class TesteAutomovel {

public static void main(String[] args) {
	
	Automovel auto1 = new Automovel();
	
	auto1.setFabricante("FIAT");
	auto1.setModelo("Palio");
	auto1.setAno(2009);		
	
	//exclamação: the static field Combustivel.ALCOOL should be accessed in a static way
	auto1.setTipoCombustivel(auto1.combustivel.ALCOOL.toString());				
	System.out.println("ALCOOL: " + auto1.qtdCombustivel(180));
	
	auto1.setTipoCombustivel(auto1.combustivel.GASOLINA.toString());		
	System.out.println("GASOLINA: " + auto1.qtdCombustivel(180));
			
	auto1.setTipoCombustivel(auto1.combustivel.FLEX.toString());		
	System.out.println("FLEX: " + auto1.qtdCombustivel(180));
			
}

}[/code]

Como retirar estas exclamações do meu codigo?!

As exclamações são somente Warnnings… elas não atrapalham a compilar… só te alertam para algum possível mau uso de variável, nenhum desses Warnnings afetam o resultado final do seu programa… apesar de estarem mostrando péssimos hábitos de programação. mas acredito que você deve ser iniciante em java.

Tá fazendo o que você queria? tá funcionando do jeito que você precisava? Então, tá bom. 8)
Enquanto aos Warnnings …

private String fabricante = ""; //exclamação: The field Automovel.fabricante is never ready locally private int ano = 0; //exclamação: The field Automovel.ano is never ready locally private String modelo =""; //exclamação: The field Automovel.modelo is never ready locally
esse aqui são corrigidos se você usar a convenssão JavaBeans. e setar adequadamente os métodos getters, setters, etc… é coisa boba.

//exclamação: the static method valueOf(String) from the type Combustivel should be accessed in a static way return combustivel.valueOf(tipoCombustivel).rendimento() * distancia;
Esse aqui tá pedindo pra você acessar os combustiveis a partir da classe (Combustivel) ao invés do objeto(combustivel).
ficaria assim:

return Combustivel.valueOf(tipoCombustivel).rendimento() * distancia;

quanto a essa pergunta:
//Funciona destes dois modos… por que?
estude um pouco mais o modificador ‘static’. E nesse caso é porque os valores do enum se comportam como static. mas não são… :smiley:

o q vc perguntou tá respondido… rsrsr. T+

Valeu pela força! relamente estou querendo engatinhar no java!

Você quis dizer que se comportam como ‘static’ por que realmente são, certo?

Veja o trecho extraído daqui:

Entenda-se por constante, um campo do tipo static final (e, no caso de enums, public).

Você quis dizer que se comportam como ‘static’ por que realmente são, certo?

Veja o trecho extraído daqui:

Entenda-se por constante, um campo do tipo static final (e, no caso de enums, public).[/quote]

É, são static… me expressei mal… quis dizer que se comportam como static apesar de não se declarar isso explicitamente… mas os valores são de fato static final… vc tem razão, escrevi mal isso… :roll: