-1

このリンクからファクトリ パターンの例を取り上げました

ただし、コードを自分の IDE にコピーすると、コンストラクターにオーバーライド可能なメソッド呼び出しがあるという警告が表示されます。私はこれが何を意味するかを理解しています.factoryパターンがこの問題を解決するはずだと思っただけですか? チュートリアルに欠陥はありますか?私は何か違うことをすべきですか?

貼り付けるコードの量を節約するために、車種の 1 つだけを含めました。

クラスCar:

package FactoryPattern;

public abstract class Car {



    public Car(CarType model){
        this.model = model;
        arrangeParts();
    }

    private void arrangeParts(){
        //Do one time processing herer
    }

    //Do subclass level processing in this method

    protected abstract void construct();
    private CarType model = null;
    public CarType getModel(){
        return model;
    }

    public void setModel (CarType model){
        this.model = model;
    }


}

クラスCarFactory:

package FactoryPattern;


public class CarFactory {

    public static Car buildCar(CarType model){
        Car car = null;
        switch (model) {
            case SMALL:
                car = new SmallCar();
                break;
            case SEDAN:
                car = new SedanCar();
                break;
            case LUXURY:
                car = new LuxuryCar();
                break;
            default:
                //throw an exception
                break;        
        }
        return car;
    }    
}

クラスFactoryPattern:

package FactoryPattern;

public enum CarType {

    SMALL, SEDAN, LUXURY

}

package FactoryPattern;

public class LuxuryCar extends Car {

    LuxuryCar(){
        super(CarType.LUXURY);
        construct();
    }

    @Override
    protected void construct(){
        System.out.println("Building Luxury Car");
    }

}

クラスCarFactoryTest:

package FactoryPattern;

public class CarFactoryTest {
    public static void main(String[] args) {

        CarFactory.buildCar(CarType.SMALL);
        CarFactory.buildCar(CarType.SEDAN);
        CarFactory.buildCar(CarType.LUXURY);
    }

}
4

1 に答える 1

1

警告はここから来ます

LuxuryCar(){
    super(CarType.LUXURY);
    construct();
}

construct()メソッドはであるため、のprotectedサブクラスでオーバーライドできますLuxuryCar。知らない開発者がメソッドをオーバーライドし、親クラスでまだ初期化されていないフィールドを使用しようとすると、多くのことがうまくいかない可能性があります。IDE が警告しているのはそのためです。

例えば、

public class LuxuryCar extends Car {
    protected Televesion tv;

    LuxuryCar(){
        super(CarType.LUXURY);
        construct(); // will call the overriden method in the sub class
    }

    @Override
    protected void construct(){
        tv = new Television();
    }
}

public class BetterLuxuryCar extends LuxuryCar {
    BetterLuxuryCar(){
        super();
    }

    @Override
    protected void construct(){
        tv.upgrade(); // oops NullPointerException
    }
}

construct()のようなメソッドは、Factory 自体に属しているように見えることに注意してください。また、クラスはフィールドをCar必要としません。サブタイプはすでにそれがどのタイプであるかを知っています。CarType

于 2013-11-12T13:45:54.467 に答える