2012-02-22 10 views
-1

私はThinking In Javaからいくつかの演習を行っています。私は1つの練習にいくつか問題があります。それは言う:newInstanceを使用してオブジェクトを作成する

コンストラクタはファクトリメソッドの一種です。明示的なファクトリを使用する代わりに、ClassオブジェクトがListに格納され、newInstance()が各オブジェクトの作成に使用されるように、RegisteredFactories.javaを変更します。

どうすれば実現できますか?以下は、ファクトリインタフェースとRegisteredFactoriesクラスのコードです。それはいくつかの工場が含まれており、静的ブロック内で開始されたあなたのリストのthats

package typeinfo.factory;  
public interface Factory<T> { T create(); } ///:~ 
package cont; 

import typeinfo.factory.*; 
import java.util.*; 


class Part { 

    public String toString() { 
    return getClass().getSimpleName(); 
    } 

    static List<Factory<? extends Part>> partFactories = 
    new ArrayList<Factory<? extends Part>>();  

    static { 
    // Collections.addAll() gives an "unchecked generic 
    // array creation ... for varargs parameter" warning. 
    partFactories.add(new FuelFilter.Factory()); 
    partFactories.add(new AirFilter.Factory()); 
    partFactories.add(new CabinAirFilter.Factory()); 
    partFactories.add(new OilFilter.Factory()); 
    partFactories.add(new FanBelt.Factory()); 
    partFactories.add(new PowerSteeringBelt.Factory()); 
    partFactories.add(new GeneratorBelt.Factory()); 
    } 

    private static Random rand = new Random(47); 
    public static Part createRandom() { 
    int n = rand.nextInt(partFactories.size()); 
    return partFactories.get(n).create(); 
    } 
} 

class Filter extends Part {} 

class FuelFilter extends Filter { 
    // Create a Class Factory for each specific type: 
    public static class Factory 
    implements typeinfo.factory.Factory<FuelFilter> { 
    public FuelFilter create() { return new FuelFilter(); } 
    } 
} 

class AirFilter extends Filter { 
    public static class Factory 
    implements typeinfo.factory.Factory<AirFilter> { 
    public AirFilter create() { return new AirFilter(); } 
    } 
} 

class CabinAirFilter extends Filter { 
    public static class Factory 
    implements typeinfo.factory.Factory<CabinAirFilter> { 
    public CabinAirFilter create() { 
     return new CabinAirFilter(); 
    } 
    } 
} 

class OilFilter extends Filter { 
    public static class Factory 
    implements typeinfo.factory.Factory<OilFilter> { 
    public OilFilter create() { return new OilFilter(); } 
    } 
} 

class Belt extends Part {} 

class FanBelt extends Belt { 
    public static class Factory 
    implements typeinfo.factory.Factory<FanBelt> { 
    public FanBelt create() { return new FanBelt(); } 
    } 
} 

class GeneratorBelt extends Belt { 
    public static class Factory 
    implements typeinfo.factory.Factory<GeneratorBelt> { 
    public GeneratorBelt create() { 
     return new GeneratorBelt(); 
    } 
    } 
} 

class PowerSteeringBelt extends Belt { 
    public static class Factory 
    implements typeinfo.factory.Factory<PowerSteeringBelt> { 
    public PowerSteeringBelt create() { 
     return new PowerSteeringBelt(); 
    } 
    } 
} 

public class RegisteredFactories { 
    public static void main(String[] args) { 
    for(int i = 0; i < 10; i++) 
     System.out.println(Part.createRandom()); 
    } 
} 
+0

は「クラスオブジェクトはリストに保存されています」。どのリスト? – Tudor

+0

これは、この本からの正確な質問です。ちょっと混乱します。私はそれがいずれかのリスト(しかし、なぜ著者がTheを使用したのか)またはRegisteredFactoriesクラスですでに使用されているリストであると仮定します。 – aretai

+0

okこれからもっと頑張ります。私が過去に尋ねた各質問に戻るのは難しい – aretai

答えて

2

作成:

import java.util.*; 

class Part { 

    public String toString() { 

    return getClass().getSimpleName(); 

    } 

    static List<Class> partFactories = new ArrayList<Class>(); 

    static { 

    // Collections.addAll() gives an "unchecked generic 

    // array creation ... for varargs parameter" warning. 

    partFactories.add(FuelFilter.class); 

    partFactories.add(AirFilter.class); 

    partFactories.add(CabinAirFilter.class); 

    partFactories.add(OilFilter.class); 

    partFactories.add(FanBelt.class); 

    partFactories.add(PowerSteeringBelt.class); 

    partFactories.add(GeneratorBelt.class); 
    } 


    private static Random rand = new Random(47); 

    public static Part createRandom() throws Exception { 

    int n = rand.nextInt(partFactories.size()); 

    return (Part)(partFactories.get(n).newInstance()); 

    } 

} 



class Filter extends Part {} 

class FuelFilter extends Filter { 
} 
class AirFilter extends Filter { 
} 
class CabinAirFilter extends Filter { 
} 
class OilFilter extends Filter { 
} 
class Belt extends Part {} 
class FanBelt extends Belt { 
} 
class GeneratorBelt extends Belt { 
} 
class PowerSteeringBelt extends Belt { 
} 



public class aa{ 

    public static void main(String[] args) { 

    for(int i = 0; i < 10; i++) 

     try {System.out.println(Part.createRandom()); }catch (Exception e) {} 

    } 

} 
0

static List<Factory<? extends Part>> partFactories

をありがとうございます。
このコードは、ランダムにcreateRandom方法のアイデアではなく新しい呼び出すことにより、オブジェクトを作成する、あなたは彼らが持っている意味し、インターフェース工場を実装
すべての工場ここに工場を使用して作成することをある

を使用して工場を経由してオブジェクトを作成します呼ばれる方法は、()希望クラスの新しいインスタンスを返します
を(1、工場が属する)ここ

+0

それは作者が話しているリストであればよかったです。質問の基準を満たすためにコードをどのように変更する必要がありますか? – aretai

+1

これはあなたがリストに入れたものです:PowerSteeringBelt.class;リストを参照してインスタンスを作成すると、partFactories.get(n).getClass()。newInstance();というインスタンスが作成されます。あなたはすべての工場関連のコードを削除することができます –

+0

私はそれをしようとしました。私が理解しているように、静的List <?にリストを再定義する必要があります。 Part> partFactories = new ArrayList <?パーツ>(); //しかし、コンパイラはそれを許可しません。その後、私はpartFactories.add(新しいPowerSteeringBelt.Factory())を変更する必要があります。 partFactories.add(PowerSteeringBelt.class);に追加します。どのようにそれを修正するには? – aretai

関連する問題