12

これが私の問題の抽象的な例です。Carタイプ ( ) を持つ一般的なクラス ( ) がありbrandます。すべてのオブジェクトはブランドによってのみ異なり、このブランドに基づいて異なる方法で処理する必要があります。

このクラスのすべてのオブジェクトは、サービス クラスのリストに収集されます。サービスは、リスト全体に対してルーチンを実行する必要がありますが、これはほとんど同じです。間にある 1 つの関数呼び出しだけが異なる必要があります。

この型に基づいて、さまざまなメソッドを呼び出したいと考えています。現時点では、enum 型に対して equals をアサートし、結果に基づいてさまざまなメソッドを呼び出しています。しかし、これはちょっと醜いので、これに関するより良い解決策があるのだろうか?

class Car {
    public enum Brand {
        BMW, AUDI;
    }

    private Brand brand;

    specificMeth1();
    specificMeth2();
}


class Service {

    List<Car> bmw;
    List<Car> Audi;

    processCar() {
        processList(bmw);
        processList(audi);
    }

    processList(List<Car> list) {
        for (Car car : list) {
            if (car.getBrand.equals(Brand.BMW)) {
                specificMeth1();
            } else {
                specificMeth2();
            }
        }
    }
}
4

2 に答える 2

33

メソッドを列挙型に入れる必要があります。

public enum Brand {
    BMW {
        @Override
        public void doSomething();
    },
    AUDI {
        @Override
        public void doSomething();
    };

    public abstract void doSomething();
}

var.getBrand().doSomething();
于 2012-10-17T13:43:03.300 に答える
6

次のように、列挙型で抽象メソッドを定義することを検討してください。

public enum Brand {
    BMW {
        public void specificMethod() {
            System.out.println("meth1");
        }
    },

    AUDI {
        public void specificMethod() {
            System.out.println("meth2");
        }
    };

    public abstract void specificMethod();
}

次に、次のように呼び出すことができます。

for (Car car : list) {
    car.getBrand().specificMethod();
}
于 2012-10-17T13:46:41.240 に答える