Enums

Bom dia a todos!!!

Em meio a véspera de Natal, estou estudando para a SCJP por meio do livro da Kathy Sierra…

E surgiu uma dúvida sobre enums…
Eles são tratados muito parecidos com classes, “parecidos”…

O nome de um arquivo - fonte deve ser o mesmo de uma classe Pública, se houver uma classe pública…

Mas, se tivermos no mesmo arquivo-fonte um enum público ? o Arquivo - fonte tb deve ter o mesmo nome deste enum?

Se sim, então eu não posso ter um enum público e uma classe pública no mesmo arquivo…CERTO?

Obrigado para quem puder me ajudar!

Pelo que eu lembre, enums são classes que obrigatoriamente extendem a classe Enum… só isso!

Não :stuck_out_tongue: Você pode ter quantas classes/enums você quiser dentro de um mesmo fonte… claro que é uma boa prática separar cada um em um arquivo, por questões de legibilidade, ou você acaba com algo como…:

public class EnumTest {

	public enum MyEnum{
		ONE,
		TWO,
		THREE;
	}
	
	public enum MyEnum2 {
		FOUR,
		FIVE,
		SIX;
	}
	
	private int atrib;
	
	public EnumTest(){
		this.atrib++;
	}
	
	public class EnumTest2 {
		// ...
	}
	
	public class EnumTest3 {
		// ...
	}
}

E o main, repare que maneira ‘bonita’ de instanciar os objetos:

	public static void main(String[] args) {
	    EnumTest testOne = new EnumTest();
	    EnumTest.EnumTest2 testTwo = testOne.new EnumTest2();
	    EnumTest.EnumTest3 testThree = testOne.new EnumTest3();
	    
	    EnumTest.MyEnum enum1 = EnumTest.MyEnum.ONE;
	    EnumTest.MyEnum2 enum2 = EnumTest.MyEnum2.FIVE;
	}

Pelo que sei, depende de como você efetuar a declaraçao do enum.

Se você efetuá-la dentro da classe (como nos exemplos do MarceloS), o enum pode ser público e estar dentro de outra classe (como uma classe interna).
Porém se você declarar o enum fora da classe, ele vai precisar de um arquivo específico para ele. Como nos exemplos:

// Exemplo de declaração VÁLIDA de enum público

public class Enums {

	public enum kindSize {

		SMALL(1, "Small"), MEDIUM(2, "Medium"), BIG(3, "Big"), OTHER(0, null);
		int size = 0;
		private String text;

		boolean isTextNull() {
			return text == null;
		}

		String getText() {
			return text;
		}

		kindSize(int i, String txt) {
			size = i;
			text = txt;
		}
	}
}

// Exemplo de dclaração INVÁLIDA de enum público

public enum kindSize {

	SMALL(1, "Small"), MEDIUM(2, "Medium"), BIG(3, "Big"), OTHER(0, null);
	int size = 0;
	private String text;

	boolean isTextNull() {
		return text == null;
	}

	String getText() {
		return text;
	}

	kindSize(int i, String txt) {
		size = i;
		text = txt;
	}
}

public class Enums {

}

ai eu troquei o nome do enum para X e o da classe para teste… a classe tirei o public e coloquei no enum o public… (comentei o construtor tb) veja só o q q eu consegui…

acho q respondeu…

[quote=Robsonramosabrao]Bom dia a todos!!!

Em meio a véspera de Natal, estou estudando para a SCJP por meio do livro da Kathy Sierra…

E surgiu uma dúvida sobre enums…
Eles são tratados muito parecidos com classes, “parecidos”…

O nome de um arquivo - fonte deve ser o mesmo de uma classe Pública, se houver uma classe pública…

Mas, se tivermos no mesmo arquivo-fonte um enum público ? o Arquivo - fonte tb deve ter o mesmo nome deste enum?
[/quote]

O que a Kate quer dizer é que se existe um TIPO publico no arquivo o nome do arquivo tem que ser igual ao desse tipo.
TIPO pode ser classe, interface, enum ou anotação.

É possivel ter mais de um tipo publico no arquivo, desde que todas além da primeira esteja definidas dentro da primeira.
Assim

[code]

public class ClassPublica {

public interface InterfacePublica {

}

public enum EnumPublico {

}

}[/code]

o problema é que para definir uma variável com o tipo interno vc tem que usar sempre o externo
Por exemplo

[code]
public class OutraClasseEmAlgumLugar implements ClassPublica.InterfacePublica {

}[/code]

Agora, ter mais do que um tipo publico no mesmo arquivo pode ser interessante em casos especiais ( veja Map.Entry no java padrão como exemplo) mas não é muito comum porque singifica que as classes têm alguma relação especial. Essa relação é rara.
Normalmente quando vc pensa em fazer isso vc não precisa realmente e pode criar dois arquivos separados para cada um.

isso é uma boa dúvida, enum não é somente para trabalhar com tipos ou algo do tipo:? por exemplo: na minha classe enum eu coloco os estados do brasil, ou os tipos de logradouro, etc
seria isso?

Bom…

Continuando…

Tirei algumas conclusões testando na IDE, porém, só testar na IDE não me é suficiente, quero entender o porque das coisas que é mto bom…

Bom,
realmente o nome do fonte tem que ser o nome do tipo público que ele contenha e só podemos ter um público por fonte…

Portanto, não posso posso ter um enum público junto com uma classe pública…

Creio que isto seria uma boa pegadinha na hora da prova…

[quote=Robsonramosabrao]Bom…

Portanto, não posso posso ter um enum público junto com uma classe pública…

[/quote]

Como o sergiotaborda simplificou, pode sim. Desde que o segundo esteja contido no primeiro.

Ah sim…hehe

" Não posso ter um enum público junto com uma classe pública,se o enum for declarado fora da classe…"