0

これは、SCJP 6 の例から取ったプログラムです。ここでは、さまざまなコーヒー サイズの を作成し、列挙のオンス値部分を取得するためにenum呼び出されるプライベート変数を宣言します。ounces

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
        }
    }
4

4 に答える 4

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.sizetypeCoffeSizeであり、その method がありgetLidCode()ます。期待どおり、オーバーライドされたメソッドの値が出力されます。

于 2013-08-07T05:12:56.807 に答える
1

についてはあまり詳しくありませんenumが、あなたの質問に対する答えは次のとおりだと思います。

OVERWHELMINGLid には Lid A と B の 2 種類があります。 B は 3 番目のコーヒーの標準サイズの宣言 ( )の直後にあるため、getLidCode()が呼び出されてがCoffeeSize一致20すると、 Lid が返されBます。12、14、または など、手動で設定された他のサイズがある場合は、BIGHUGE返されAます。

つまり、リッド B は圧倒的なコーヒーの標準的なリッドということです。顧客が 12 オンス、18 オンス、またはその他のオンスのコーヒーを要求した場合、または aBIGまたは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"
于 2013-08-07T05:17:41.317 に答える
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() ;
    }
}

SUBTRACTIONDIVISION、およびPOWERは、メソッドが呼び出されると例外をスローしoperateます (何らかの理由で、この時点では可換演算のみが実装されています)。ただし、期待値 (それぞれ 5.6 と 9.0) を返しますBinaryOperation.ADDITION.operate(3.5,2.1)BinaryOperation.MULTIPLICATION.operate(4.5,2.0)これは、使用法に関する質問にも答えます。はい、暫定的な例は正しいです。

フィールドやその他のメカニズムを使用してこれを実装する簡単なオブジェクト指向の方法はありません。

于 2013-08-07T05:51:24.750 に答える
0

これは getOunces ではなく 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());

}

}

これにより、次のような出力が得られます。

20

B

于 2013-08-07T05:20:26.487 に答える