Commit b39dd039 by Patryk Czarnik

enum

parent 8b4e8917
package gotowe.p20_enum;
public enum DzienTygodnia1 {
PON, WTO, SRO, CZW, PIA(), SOB, NIE
}
// Deklaracja enuma określa wszystkie obiekty,
// poza tym miejscem nie da się utworzyć nowych obiektów klasy enumowej.
package gotowe.p20_enum;
public enum DzienTygodnia2 implements AutoCloseable {
// Wartości mogą być tworzone poprzez wywołanie odpowiedniego konstruktora:
DODATKOWY(13L),
PON("poniedziałek"),
WTO("wtorek"),
SRO("środa"),
CZW("czwartek"),
PIA("piątek"),
SOB("sobota"),
NIE("niedziela");
// Enum, jak zwykła klasa, może zawierać:
// * pola
private String nazwa;
public int dlugoscTekstu;
// * Konstruktory (są prywatne, bo są używane tylko wewnątrz "klasy"!)
// można napisać poziom widoczności private, ale nawet jak nie napiszemy, to i tak będzie private
// nie wolno podać innego poziomu widoczności
DzienTygodnia2(String jakaNazwa) {
nazwa = jakaNazwa;
dlugoscTekstu = jakaNazwa.length();
}
private DzienTygodnia2(Number numer) {
}
//NK public DzienTygodnia2(int numer) { }
// * Metody (i mogą implementować interfejsy)
public void wypiszSie() {
System.out.println("Jestem sobie " + this.nazwa + " i mam kod " + this.name() + " oraz numer " + this.ordinal());
}
public void close() {
System.out.println("się zamykam...");
}
@Override
public String toString() {
return nazwa;
}
// Można też definiować zmienne i metody statyczne
static String napisStatyczny = "Ala ma kota";
static void metodaStatyczna() {
System.out.println(napisStatyczny);
}
}
package gotowe.p20_enum;
public enum DzienTygodnia3 {
// Wartości mogą być tworzone poprzez wywołanie odpowiedniego konstruktora:
PON("poniedziałek"),
WTO("wtorek"),
SRO("środa"),
CZW("czwartek"),
PIA("piątek"),
SOB("sobota"),
// Możliwość nadpisania metody dla wybranych wartości (technicznie: powstaje podklasa)
NIE("niedziela") {
@Override
public boolean handelDozwolony() {
return false;
}
public void nowaMetoda() { }
};
// Enum, jak zwykła klasa, może zawierać:
// * pola
private String nazwa;
// * Konstruktory (mogą być prywatne, bo sa używane tylko wewnątrz "klasy"!)
private DzienTygodnia3(String jakaNazwa) {
nazwa = jakaNazwa;
}
// * Metody
@Override
public String toString() {
return nazwa;
}
public boolean handelDozwolony() {
return true;
}
}
package gotowe.p20_enum;
import java.util.Arrays;
public class Test1 {
static String tekst(DzienTygodnia1 dt) {
// można użyć switch, nie wolno prefiksować wartości nazwą klasy
switch (dt) {
//case DzienTygodnia1.PON: return "poniedziałek";
case PON: return "poniedziałek";
case WTO: return "wtorek";
case SRO: return "środa";
case CZW: return "czwartek";
case PIA: return "piątek";
case SOB: return "sobota";
case NIE: return "niedziela";
// ale mimo wyczerpania wszystkich wartości potrzebny default
default : return "???";
}
}
public static void main(String[] args) {
DzienTygodnia1 dt = DzienTygodnia1.WTO;
String zmienna = "WTO";
DzienTygodnia1 wczytany = DzienTygodnia1.valueOf(zmienna);
//EXN DzienTygodnia1a wczytany = DzienTygodnia1.valueOf("nie ma takiego dnia");
// IllegalArgumentException
if(dt == wczytany) {
System.out.println("równe");
} else {
System.out.println("nierówne");
}
if(dt.equals(wczytany)) {
System.out.println("równe");
} else {
System.out.println("nierówne");
}
// == równoważne equals; dla każdej wartości enuma istnieje dokładnie jeden obiekt
System.out.println();
// Standardowo dostępne informacje dla pojedynczej wartości:
System.out.println(dt);
System.out.println(dt.toString());
System.out.println(dt.name());
System.out.println(dt.ordinal()); // od 0
//NK System.out.println(dt < wczytany);
System.out.println(dt.compareTo(wczytany)); // OK
System.out.println(tekst(dt));
System.out.println();
// Standardowo dostępne rzeczy dla klasy enuma:
DzienTygodnia1 dt4 = DzienTygodnia1.valueOf("PIA");
System.out.println(dt4);
DzienTygodnia1[] values = DzienTygodnia1.values();
System.out.println(Arrays.toString(values));
System.out.println(DzienTygodnia1.class.getSuperclass());
}
}
package gotowe.p20_enum;
import static gotowe.p20_enum.DzienTygodnia1.*;
import java.util.Arrays;
public class Test1_import_static {
static String tekst(DzienTygodnia1 dt) {
// można użyć switch, nie wolno prefiksować wartości nazwą klasy
switch (dt) {
case PON: return "poniedziałek";
case WTO: return "wtorek";
case SRO: return "środa";
case CZW: return "czwartek";
case PIA: return "piątek";
case SOB: return "sobota";
case NIE: return "niedziela";
// ale mimo wyczerpania wszystkich wartości potrzebny default
default : return "???";
}
}
public static void main(String[] args) {
// dzięki static import mogę używać krótkich nazw z enuma także poza switch
DzienTygodnia1 dt = WTO;
DzienTygodnia1 wczytany = DzienTygodnia1.valueOf("WTO");
//EXN DzienTygodnia1a wczytany = DzienTygodnia1.valueOf("nie ma takiego dnia");
// IllegalArgumentException
if(dt == wczytany) {
System.out.println("równe");
} else {
System.out.println("nierówne");
}
if(dt.equals(wczytany)) {
System.out.println("równe");
} else {
System.out.println("nierówne");
}
// == równoważne equals; dla każdej wartości enuma istnieje dokładnie jeden obiekt
System.out.println();
// Standardowo dostępne informacje dla pojedynczej wartości:
System.out.println(dt);
System.out.println(dt.toString());
System.out.println(dt.name());
System.out.println(dt.ordinal()); // od 0
//NK System.out.println(dt < wczytany);
System.out.println(dt.compareTo(wczytany)); // OK
System.out.println(tekst(dt));
System.out.println();
// Standardowo dostępne rzeczy dla klasy enuma:
DzienTygodnia1 dt4 = DzienTygodnia1.valueOf("PIA");
System.out.println(dt4);
DzienTygodnia1[] values = DzienTygodnia1.values();
System.out.println(Arrays.toString(values));
System.out.println(DzienTygodnia1.class.getSuperclass());
}
}
package gotowe.p20_enum;
public class Test2 {
public static void main(String[] args) {
DzienTygodnia2 dt = DzienTygodnia2.WTO;
// mogę odwoływać się do zmiennych nie-prywatnych z obiektu enum, nawet je modyfikować
System.out.println(dt.dlugoscTekstu);
dt.dlugoscTekstu += 100;
System.out.println(dt.dlugoscTekstu);
System.out.println(DzienTygodnia2.WTO.dlugoscTekstu);
dt.wypiszSie();
}
}
package gotowe.p20_enum;
public class Test3 {
public static void main(String[] args) {
DzienTygodnia3 wtorek = DzienTygodnia3.WTO;
System.out.print(wtorek + " ");
System.out.println(wtorek.handelDozwolony());
System.out.println(wtorek.name() + " " + wtorek.ordinal());
System.out.println(wtorek.getClass());
System.out.println(wtorek.getClass().getSuperclass());
System.out.println(wtorek.getClass().getSuperclass().getSuperclass());
System.out.println(wtorek.getClass().getSuperclass().getSuperclass().getSuperclass());
System.out.println();
DzienTygodnia3 niedziela = DzienTygodnia3.NIE;
System.out.print(niedziela + " ");
System.out.println(niedziela.handelDozwolony());
System.out.println(niedziela.name() + " " + niedziela.ordinal());
System.out.println(niedziela.getClass());
System.out.println(niedziela.getClass().getSuperclass());
System.out.println(niedziela.getClass().getSuperclass().getSuperclass());
System.out.println(niedziela.getClass().getSuperclass().getSuperclass().getSuperclass());
}
}
package gotowe.p20_enum;
import gotowe.p20_enum.E4.KlasaIntancyjna;
class Zagniezdzanie1 {
int instancyjna = 10;
static int statyczna = 20;
enum E1 {A, B, C,}
static enum E2 {A, B, C;}
// Nawet jeżeli nie napiszemy static, to enum zagnieżdżony w klasie jest static
enum E3 {A, B, C;
public void metoda() {
System.out.println(statyczna);
// enum jest w kontekście statycznym
//NK System.out.println(instancyjna);
}
}
}
// W enumie mogę też zagnieździć klasę lub enuma
enum E4 {
A, B, C;
static class KlasaStatyczna {
void print() {
System.out.println("aaa");
//NK System.out.println("bbb " + name());
}
}
class KlasaIntancyjna {
void print() {
// name() to będzie nazwa tewartości (jednej z A B C),
// z której został pobrany obiekt tej klasy
System.out.println("bbb " + name());
}
}
interface III {
void test();
}
enum E5 {
}
}
public class Zagniezdzanie {
public static void main(String[] args) {
Zagniezdzanie1.E1 x = Zagniezdzanie1.E1.A;
E4.KlasaStatyczna y = new E4.KlasaStatyczna();
y.print();
KlasaIntancyjna z = E4.C.new KlasaIntancyjna();
z.print();
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment