17 Ekim 2019 Perşembe

Enum Sınıfı

Giriş
Şu satırı dahil ederiz.
import java.lang.Enum;
Naming Convention
Enum'daki tüm alanlar büyük harf olmalı. Aslında bu yazıdaki birçok örnek yanlış isimlendirme kullanıyor :) Kullanılan regex şöyle
^[A-Z][A-Z0-9](_[A-Z0-9]+)$
Örnek
Açıklaması şöyle
Which basically means, only use upper case characters, numbers and underscores (in the order which is valid Java syntax). So instead of StreetOwner, use STREET_OWNER. RegisteredBy should be REGISTERED_BY and so forth.
Şu kod yanlış.
public enum StreetNameEnum {

  StreetOwner("0"), StreetedBy("1"), StreetedFor("2"), RegisteredBy("3");

  private String code;

  StreetRoleEnum(String code) {
  }
  ...
}
constructor
Constructor eğer varsa private kabul edilir. Açıklaması şöyle
In an enum declaration, a constructor declaration with no access modifiers is private.
Örnek
Şöyle yaparız. Burada koda private yazılmış ancak yazılmasa da olurdu.
public enum TargetingName {

  CONTENT("Content", "Content Targeting"),
  TECHNOLOGY("Technology", "Technology Targeting");

  private TargetingName(String textToSelect, String textDisplayed) {
    this.textToSelect = textToSelect;
    this.textDisplayed = textDisplayed;
  }
  
  private String textToSelect;
  private String textDisplayed;
  
  public String getTextDisplayed() {
    return textDisplayed;
  }

  public String getTextToSelect() {
    return textToSelect;
  }
}
name metodu
Örnek ver

ordinal metodu
Örnek ver

valueOf metodu
Herhangi bir Enum'a isim ile erişmek için şöyle yaparız.
static <E extends Enum<E>> E getEnumByName(Class<E> enumClass, String name) {
  return Enum.valueOf(enumClass, name);
}
values metodu - Kullanmayın
Açıklaması şöyle
Problem with Enum.values() is that it has to be an immutable list by specification. In order to achieve this it returns a new array instance with the enum values every time it is called.
Görmek için şöyle yaparız
public enum Fruits {
    APPLE, PEAR, ORANGE, BANANA;

    public static void main(String[] args) {
        System.out.println(Fruits.values());
        System.out.println(Fruits.values());
    }
}
// output
// [Lcom.test.Fruits;@7ad041f3
// [Lcom.test.Fruits;@251a69d7
Örnek
Elimizde şöyle bir kod olsun.
public enum Colour
{
  ROOD, GEEL, GROEN, BLAUW, PAARS;
}
Şöyle yaparız.
List<Colour> colourList = Arrays.asList(Colour.values());
Collections.shuffle(colourList);
toString metodu
Bunu 3 şekilde yapabiliriz.
1. Tek bir toString() ile
Şöyle yaparız
@Override
public String toString() {
  switch (this) {
    case GAME_BOY:
      return "Game boy";
    case MACBOOK:
      return "Macbook Pro";
    ...
  }
}
2. constructor parametresi ile
Şöyle yaparız
public enum Other {

  GAME_BOY("Game Boy"), MACBOOK("Macbook Pro"), IPHONE("iPhone XS"), LAPTOP("Laptop");

  private final String product; 

  private Other(String passed) {
    this.product = passed;
  }

  @Override
  public String toString() {
    return product;
  }
}
3. Her enum Değeri İçin toString() İle
Şöyle yaparız
public enum Other {
  GAME_BOY {
    @Override public String toString() { return "Game Boy"; }
  },
  MACBOOK { ... },
  ...
}
Diğer
1. Kalıtım
Enum sınıfı kalıtım yapabilir. Şöyle yaparız.
interface A {}

enum C implements A {
  ITEM_A,
  ITEM_B,
}
Kaltımda enum alanı da arayüze uymak zorundadır. Elimizde şöyle bir kod olsun. Bu kod derlenmez. Çünkü DoorFactory.EXTERIOR yine IDoorFactory cinsindendir. Dolayısıyla getDoor() metodu Door tipnden nesne döner. Bunu da ExteriorDoor'a atamak mümkün değil.
public static class Door  {      }    
public static class ExteriorDoor extends Door  {  }  
public interface IDoorFactory  {    
  public Door getDoor();
}

public enum DoorFactory implements IDoorFactory
{
  EXTERIOR {
    @Override
    public ExteriorDoor getDoor() {
      //valid covariant method override
      return new ExteriorDoor(); 
    }
  },
  INTERIOR {
    @Override
    public Door getDoor() {
      return new Door();
    }
  }
}  

public static void main(String[] args)  
{
  //invalid, method only returns a Door
  ExteriorDoor door = DoorFactory.EXTERIOR.getDoor();  
}

Hiç yorum yok:

Yorum Gönder