2013-08-07 7 views
0

Вот программа, взятая из примера SCJP 6. Здесь мы создаем enum с разными размерами кофе и объявляем приватную переменную под названием ounces, чтобы получить часть перечисления унции.Enum Пример Объяснение

Мне не удалось разобраться в использовании метода getLidCode, который является чрезмерно высоким. Как получить доступ к методу getLidCode?

package com.chapter1.Declaration; 

enum CoffeSize { 
    BIG(8), HUGE(10), OVERWHELMING(20) { 
     public String getLidCode() { 
      return "B"; 
     } 
    }; 

    CoffeSize(int ounce) { 
     this.ounce = ounce; 
    } 

    private int ounce; 

    public int getOunce() { 
     return ounce; 
    } 

    public void setOunce(int ounce) { 
     this.ounce = ounce; 
    } 

    public String getLidCode() { 
     return "A"; 
    } 
} 

public class Prog7 { 

    CoffeeSize size; 

    public static void main(String[] args) { 

     Prog7 p = new Prog7(); 
      p.size = CoffeeSize.OVERWHELMING; 

      System.out.println(p.size.getOunces()); 

      //p.size.getLidCode(); ? is this correct way 
     } 
    } 
+0

Короче говоря, это правильный путь. 'p.size.getLidCode();' дает вам 'B'. – pad

ответ

5

Это имеет смысл, если вы пространство его немного больше:

enum CoffeSize { 
    BIG(8), 
    HUGE(10), 
    OVERWHELMING(20) { 
     public String getLidCode() { 
      return "B"; 
     } 
    }; 
    // rest of enum code here 
} 

Только OVERWHELMING является переопределяем getLidCode().

Доступ бы его с помощью этого подхода (с помощью кода):

System.out.println(p.size.getLidCode()); 

причина этого: p.size является тип CoffeSize, из которых он имеет метод getLidCode(). Он будет печатать значение переопределенного метода, как и ожидалось.

1

Я не слишком знаком с enum-х, но я считаю, что ответ на ваш вопрос заключается в следующем:

Есть два типа Lids, Лиды А и В. Так как В сразу после третьей декларации стандартные размеры кофе (OVERWHELMING), когда getLidCode() вызывается на CoffeeSize, и он соответствует 20, он вернет крышку B. Если есть другие, установленные вручную, размеры, такие как 12 или 14, или BIG или HUGE, он вернет A.

Так что, в принципе, крышка B означает стандартную крышку для подавляющего количества кофе. Если клиент запрашивает 12 унции или 18 унций, или любые другие унциях кофе, или для BIG или HUGE кофе, они получают крышку A.

В заключение:

p.size = CoffeeSize.BIG; 
System.out.println(p.size.getOunces()); // Outputs "8" 
System.out.println(p.size.getLidType()); // Outputs "A" 

p.size = CoffeeSize.OVERWHELMING; 
System.out.println(p.size.getOunces()); // Outputs "20" 
System.out.println(p.size.getLidType()); // Outputs "B" 

p.size = CoffeeSize(12); 
System.out.println(p.size.getOunces()); // Outputs "12" 
System.out.println(p.size.getLidType()); // Outputs "A" 

p.setOunce(20); 
System.out.println(p.size.getOunces()); // Outputs "20" 
System.out.println(p.size.getLidType()); // Outputs "B" 
+0

Вы на правильном пути. Единственный улов в том, что вы не можете создать экземпляр enum таким образом. – Makoto

0

Обратите внимание, что это getOunce, а не getOunces. Правильное использование.

public class Prog7 { 

CoffeSize size; 

public static void main(String[] args) { 

Prog7 p = new Prog7(); 
p.size = CoffeSize .OVERWHELMING; 

System.out.println(p.size.getOunce()); 

System.out.println(p.size.getLidCode()); 

}

}

Это дало бы выход, как:

В

1

Метод getLidCode обычно возвращает константу "A". Для CoffeSize.BIG и CoffeSize.HUGE он не переоценивается, поэтому это значение, которое они возвратят. Тем не менее, для CoffeSize.OVERWHELMING он перегружен, и он вернет «B».

Если вы считаете, что перечисления как классы и их значения перечисления являются экземплярами этого класса, перечисления позволяют переопределять метод для каждого объекта. Это невозможно для обычных классов/объектов.

Это также может быть реализован как:

enum CoffeSize { 
    BIG(8,"A"), HUGE(10,"A"), OVERWHELMING(20,"B"); 

    CoffeSize(int ounce,String lidCode) { 
     this.ounce= ounce ; 
     this.lidCode= lidCode ; 
    } 

    private int ounce; 
    private String lidCode; 

    public int getOunce() { 
     return this.ounce ; 
    } 
    public void setOunce(int ounce) { 
     this.ounce= ounce ; 
    } 
    public String getLidCode() { 
     return this.lidCode ; 
    } 
} 

Обратите внимание, что сделать это альтернативное выполнение более эквивалентно исходному, не setLidCode метод не был определен.

Истинная сила этого механизма может быть оценена более легко в следующем примере, хотя:

enum BinaryOperation { 
    ADDITION("+",1) { 
     public double operate(double a,double b) { 
      return a + b ; 
     } 
    }, 
    SUBTRACTION("-",1), 
    MULTIPLICATION("*",2) { 
     public double operate(double a,double b) { 
      return a * b ; 
     } 
    }, 
    DIVISION("/",2), 
    POWER("**",3); 

    BinaryOperation(String repr,int priority) { 
     this.repr= repr ; 
     this.priority= priority ; 
    } 

    private String repr; 
    private int priority; 

    public String toString() { 
     return this.repr ; 
    } 
    public int getPriority() { 
     return this.priority ; 
    } 
    public double operate(double a,double b) { 
     throw new UnsupportedOperationException() ; 
    } 
} 

SUBTRACTION, DIVISION и POWER сгенерирует исключение, когда их метод operate вызывается (по какой-то причине, на данный момент реализованы только коммутативные операции). Однако BinaryOperation.ADDITION.operate(3.5,2.1) и BinaryOperation.MULTIPLICATION.operate(4.5,2.0) вернут ожидаемые значения (5.6 и 9.0 соответственно). Это также отвечает на ваш вопрос об использовании. Да, ваш примерный пример правильный.

Нет простого способа реализации OO с использованием полей или других механизмов.