2016-06-29 30 views
-3

私たちは10種類のCa​​r:Bmw、Renoなどがあるとします。だから、レポのAPIを開発するための2つの方法があります。Java:ジェネリックメソッドを使用する場合と明示的なメソッドを使用する場合

最初の方法:

class Repo{ 
    public <T extends Car> T getCarByType(Class<T> clazz){..} 
} 

第二の方法:

class Repo{ 
    public Bmw getBmw(){..} 
    public Reno getReno(){..} 
    ... 
} 

は、第一に、私はそれができますように私は、最初の方法に従うべきであると思ったがより少ないコードを書いてください - >それはサポートのためにより良いです。そして、私は20種類の車を持っていれば、最初の方法は明白な利点(少ないコード)であると思いました。

しかし、車の台数が増えているので、あなたはどの車を持っているのか忘れてしまいます。第2の方法に従うと、リポジトリとタイプの明確なAPIが得られます。

だから、誰がどのような方法をいつ使うべきか説明できますか?

+2

'public Car getCar()'はどうですか?それは、発信者が車の種類にとらわれないように促し、コードを将来の車種に拡張できるようにします。 –

+0

これは実際には特に言及されているように、少なくとも具体的に答えることのできるプログラミングの質問を含んでいないので、本当に良い質問ではありません。ルノーも綴られている。 – pvg

+0

リノとは何ですか? – njzk2

答えて

1

最初の方法では、重複コードが少なくなります。あなたは車の種類をモデル化したい場合しかし、あなたはあなたの車はあなたが使用することができますので、異なるされていない場合

public <T extends Car> T getCarByType(Cars car){ 
    Class<T> type = car.getType(); 
    ... 
} 
0

まずこの列挙を使用して列挙

enum Cars { 
    BMW(Bmw.class), 
    RENO(Reno.class) 
    ; 

    Class<? extends Car> type; 

    Cars(Class<? extends Car> type){ 
    this.type = type; 
    } 

    Class<? extends Car> getType() { 
    return type; 
    } 

} 

とアクセス車を使用することができますあなたが車のタイプを変えることを可能にするタイププロパティを持つクラスカーは1つだけですが、あなたのソリューションを続行したくない場合は、両方の方法を使うことができると思います。データを取得するために使用されるすべてのコードを持っていれば、そのタイプによって各車を取り出すメソッドを公開する特定のレイヤーをその上に作成できます

ジェネリックレポ

class Repo{ 
    public <T extends Car> T getCarByType(Class<T> clazz){..} 
} 

RepoFacade

class RepoFacade{ 
    public Bmw getBmw(){ 
     Repo<Bmw> = new Repo<>(); 
     return repo.getCarByType(BMW.class); 
    } 
    public Reno getReno(){..} 
} 
0

私は単純なものとなるだろう。ブランドに基づく多形性はありません。単なるラベルなので、何の振る舞いも加えません。

public class Car { 
    public enum Make { BMW, ... }; 

    public Make make; 
    public Color color; 
    public int year; 
    // Cars have other properties, I suppose 
} 

public class Repo { 
    private List<Car> cars = new ArrayList<Car>; 

    // This could also return a list of all cars of that model, 
    // because there is no reason to have exactly one of each make. 
    @Nullable 
    public Car findByMake(Car.Make make) { 
     for (Car car : cars) { 
      if (car.make == make) { 
       return car; 
      } 
     } 
     return null; 
    } 
} 
関連する問題