English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Подборка кода для имитации логистической информации Taobao TimeLineView в Android

Использование Java enum

Метод использования one: константы

До JDK1.5 мы определяли константы следующим образом: public static fianl.... . Теперь, с помощью перечислений, можно группировать связанные константы в тип перечисления, и перечисления предоставляют больше методов, чем константы.

public enum Color { 
 RED, GREEN, BLANK, YELLOW 
} 

Метод использования two: switch

До JDK1.6 оператор switch поддерживал только типы int, char, enum. Использование перечислений делает код более читаемым.

enum Signal {
    GREEN, YELLOW, RED
  }
  public class TrafficLight {
    Signal color = Signal.RED;
    public void change() {
      switch (color) {
      case RED:
        color = Signal.GREEN;
        break;
      case YELLOW:
        color = Signal.RED;
        break;
      case GREEN:
        color = Signal.YELLOW;
        break;
      }
    }
  }

Метод добавления нового метода в перечисление

Если вы планируете определить свои методы, то必须在 конце последовательности экземпляров enum добавить точку с запятой. Кроме того, Java требует, чтобы сначала определялись экземпляры enum.

public enum Color {
    RED("красный", 1), GREEN("зеленый", 2), BLANK("белый", 3), YELLO("желтый", 4);
    // Члены переменных
    private String name;
    private int index;
    // Конструктор
    private Color(String name, int index) {
      this.name = name;
      this.index = index;
    }
    // Обычные методы
    public static String getName(int index) {
      for (Color c : Color.values()) {
        if (c.getIndex() == index) {
          return c.name;
        }
      }
      return null;
    }
    // Методы get и set
    public String getName() {
      return name;
    }
    public void setName(String name) {
      this.name = name;
    }
    public int getIndex() {
      return index;
    }
    public void setIndex(int index) {
      this.index = index;
    }
  }

Метод использования 4: Перекрытие методов枚нуемых типов

Ниже приведен пример перекрытия метода toString().

public class Test {
  public enum Color {
    RED("красный", 1), GREEN("зеленый", 2), BLANK("белый", 3), YELLO("желтый", 4);
    // Члены переменных
    private String name;
    private int index;
    // Конструктор
    private Color(String name, int index) {
      this.name = name;
      this.index = index;
    }
    // Перекрытие методов
    @Override
    public String toString() {
      return this.index + "_" + this.name;
    }
  }
  public static void main(String[] args) {
    System.out.println(Color.RED.toString());
  }
}

Метод использования 5: Реализация интерфейса

Все枚举ные типы наследуются от класса java.lang.Enum. Поскольку Java не поддерживает множественное наследование, объекты枚нуемых типов больше не могут наследовать другие классы.

public interface Behaviour {
    void print();
    String getInfo();
  }
  public enum Color implements Behaviour {
    RED("красный", 1), GREEN("зеленый", 2), BLANK("белый", 3), YELLO("желтый", 4);
    // Члены переменных
    private String name;
    private int index;
    // Конструктор
    private Color(String name, int index) {
      this.name = name;
      this.index = index;
    }
    // Интерфейсный метод
    @Override
    public String getInfo() {
      return this.name;
    }
    // Интерфейсный метод
    @Override
    public void print() {
      System.out.println(this.index + ":" + this.name);
    }
  }

Метод использования шесть: использование интерфейсов для организации перечислений

public interface Food {
    enum Coffee implements Food {
      BLACK_COFFEE, DECAF_COFFEE, LATTE, CAPPUCCINO
    }
    enum Dessert implements Food {
      FRUIT, CAKE, GELATO
    }
  }

Метод использования семь: о использовании集合ов перечислений

java.util.EnumSet и java.util.EnumMap - это два типа перечислений. EnumSet гарантирует, что элементы в集合е не повторяются; в EnumMap ключ - это тип перечисления, а значение может быть любого типа. О использовании этих двух типов не будем здесь обсуждать, можно参阅 документацию JDK

Разница между перечислением и определением констант

Первый раздел, метод определения констант

Мы обычно используем код, определенный с помощью метода public final static, как показано ниже, где 1 представляет красный свет, 3 represents green light, и 2 represents yellow light.

public class Light {
    /* Красный свет */
    public final static int RED = 1;
    /* Зеленый свет */
    public final static int GREEN = 3;
    /* Желтый свет */
    public final static int YELLOW = 2;
  }

Второй раздел, метод определения констант типа перечисления

Простая метод определения типа перечисления приведен ниже, мы не можем определить каждый элемент типа перечисления. Например, код для определения красного, зеленого и желтого света может быть следующим:

public enum Light {
    RED, GREEN, YELLOW;
  }

Мы можем представить только красный, зеленый и желтый свет, но конкретные значения мы не можем выразить. Не спешите,既然 тип перечисления предоставляет конструктор, мы можем реализовать это через конструктор и перезапись метода toString. Сначала добавьте метод конструктора к типу перечисления Light, затем каждый элемент типа перечисления传入 соответствующие параметры через конструктор, и перезапишите метод toString, в котором возвращается параметр,传入ый из конструктора. Измененный код следующий:

public enum Light {
  // Использование параметров конструктора
  RED(1), GREEN(3), YELLOW(2);
  // определение частной переменной
  private int nCode;
  // constructor, тип枚ерации может быть только частным
  private Light(int _nCode) {
    this.nCode = _nCode;
  }
  @Override
  public String toString() {
    return String.valueOf(this.nCode);
  }
}

Третий раздел, полный пример кода

Полный пример кода для типа перечисления приведен ниже:

public class LightTest {
  // 1. Определение типа перечисления
  public enum Light {
    // Использование параметров конструктора
    RED(1), GREEN(3), YELLOW(2);
    // определение частной переменной
    private int nCode;
    // constructor, тип枚ерации может быть только частным
    private Light(int _nCode) {
      this.nCode = _nCode;
    }
    @Override
    public String toString() {
      return String.valueOf(this.nCode);
    }
  }
  /**
   * 
   * @param args
   */
  public static void main(String[] args) {
    // 1.遍ение типа枚ерации
    System.out.println("Демонстрация遍ения типа枚ерации ......");
    testTraversalEnum();
    // 2. демонстрация использования объекта EnumMap
    System.out.println("Демонстрация использования и遍ения объекта EnumMap.....");
    testEnumMap();
    // 3. демонстрация использования EnumSet
    System.out.println("Демонстрация использования и遍ения объекта EnumSet.....");
    testEnumSet();
  }
  /**
   * 
   * демонстрация遍ения типом枚ерации
   */
  private static void testTraversalEnum() {
    Light[] allLight = Light.values();
    for (Light aLight : allLight) {
      System.out.println("name текущего света: " + aLight.name());
      System.out.println("ordinal текущего света: " + aLight.ordinal());
      System.out.println("Текущий свет: " + aLight);
    }
  }
  /**
   * 
   * демонстрация использования EnumMap, использование EnumMap подобно использованию HashMap, только ключ должен быть типом枚ерации
   */
  private static void testEnumMap() {
    // 1. демонстрация создания объекта EnumMap, constructor объекта EnumMap требует传入 параметр, по умолчанию это тип класса ключа
    EnumMap<Light, String> currEnumMap = new EnumMap<Light, String>(
    Light.class);
    currEnumMap.put(Light.RED, "红灯");
    currEnumMap.put(Light.GREEN, "зеленый свет");
    currEnumMap.put(Light.YELLOW, "желтый свет");
    // 2. Прогон объекта
    for (Light aLight : Light.values()) {
      System.out.println("[key=" + aLight.name() + ",value="
      + currEnumMap.get(aLight) + "]");
    }
  }
  /**
   * 
   * Демонстрация использования EnumSet, EnumSet - это абстрактный класс, который��取 содержимое枚ераций типа <BR/>
   * 
   * Можно использовать метод allOf
   */
  private static void testEnumSet() {
    EnumSet<Light> currEnumSet = EnumSet.allOf(Light.class);
    for (Light aLightSetElement : currEnumSet) {
      System.out.println("Текущие данные в EnumSet: " + aLightSetElement);
    }
  }
}

Результат выполнения таков:

Демонстрация遍ения枚рупного типа......

Текущий name: RED

Текущий ordinal: 0

Текущий свет: 1

Текущий name: GREEN

Текущий ordinal: 1

Текущий свет: 3

Текущий name: YELLOW

Текущий ordinal: 2

Текущий свет: 2

Демонстрация использования и遍ения объекта EnumMap.....

[key=RED,value=красный свет]

[key=GREEN,value=зеленый свет]

[key=YELLOW,value=желтый свет]

Демонстрация использования и遍ения объекта EnumSet.....

Текущие данные в EnumSet: 1

Текущие данные в EnumSet: 3

Текущие данные в EnumSet: 2

Четыре, отличия между способами определения констант и определением констант с помощью энумов

Следующее содержимое может быть немного скучным, но это определенно стоит того, чтобы его посмотреть

1. Код:

public class State {
public static final int ON = 1;
public static final Int OFF = 0;
}

Что плохого? Все так давно делают, и у него нет проблем.

Сначала, это не безопасно по типу. Вы должны убедиться, что это int

其次,你还要确保它的范围是0和1

最后,很多时候你打印出来的时候,你只看到 1 和0 ,

Во-вторых, вы должны убедиться, что его диапазон составляет 0 и 1

В конце концов, часто, когда вы его печатаете, вы видите только 1 и 0 ,

Но если кто-то не видит код, он не знает ваших намерений,抛弃 все ваши старые public static final constants

2. Можете создать класс enum, посмотрите на него как на обычный класс. Исключение составляет то, что он не может наследовать от других классов. (Java - это единственная инheritance, он уже наследует от Enum),

3. Параметр switch() может использовать enum.

5. Не можно наследовать от enum subclasses, если нужно расширить элементы enum, создайте реализацию интерфейса внутри enum, чтобы группировать элементы. Это достигается группировкой элементов enum.

6. Используйте EnumSet вместо флагов. Enum требует, чтобы его элементы были уникальными, но элементы enum не могут быть удалены или добавлены.

7. Key EnumMap - это enum, а value - любой другой объект Object.

8. Enum позволяет программисту писать методы для экземпляров enum. Таким образом, каждому экземпляру enum можно присвоить различное поведение.

9. Использование Chain of Responsibility с enum. Это связано с паттерном Chain of Responsibility в дизайне. Решайте проблему множеством различных способов, а затем свяжите их вместе. Когда приходит запрос, пройдите по цепочке, до тех пор, пока не найдете решение, которое может обработать запрос.

10. Использование state machine с enum.

11. Использование multiway dispatch с enum.

 Спасибо за чтение, надеюсь, это поможет вам, спасибо за поддержку нашего сайта!

Рекомендуем также