2016-06-29 29 views
-3

Nehmen wir an, wir haben 10 Arten von Auto: Bmw, Reno usw. Und wir haben Repo. So gibt es zwei Möglichkeiten für die API von Repo Entwicklung:Java: Wann Generika-Methode zu verwenden und wann explizite Methode

Der erste Weg:

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

Der zweite Weg:

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

Zuerst dachte ich, dass ich den ersten Weg folgen sollte, wie es lässt Schreibe weniger Code und -> es ist besser für die Unterstützung. Und außerdem dachte ich, dass, wenn ich 20 Arten von Autos habe, der erste Weg offensichtlicher Vorteil ist (weniger Code).

Allerdings, wie die Zahl der Autos wächst - Sie beginnen zu vergessen, welches Auto Sie haben. Wenn Sie dem zweiten Weg folgen - Sie haben eine klare API des Repos und der Typen.

Also, könnte jemand erklären, wann welche Methode zu verwenden?

+2

Wie wäre es mit 'öffentlichen Auto getCar()'? Dies würde die Anrufer ermutigen, vom Autotypus unabhängig zu sein, was den Code für zukünftige Autotypen erweiterbar macht. –

+0

Das ist nicht wirklich eine gute SO Frage, da es nicht wirklich eine spezifisch beantwortbare Programmierfrage enthält, zumindest, wie gerade gesagt. Außerdem heißt es "Renault". – pvg

+0

Was ist ein Reno? – njzk2

Antwort

1

Der erste Weg wird weniger doppelten Code produzieren. Aber wenn man die Arten von Autos modellieren möchten, können Sie eine ENUM

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

} 

und den Zugang nutzen das Auto mit dieser Enum

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

Zuerst, wenn Ihre Autos sind nicht so verschieden Sie verwenden können, Nur eine Klasse Auto, die eine Typ-Eigenschaft haben wird, die es Ihnen erlaubt, zwischen Autos zu unterscheiden, aber wenn Sie mit Ihrer Lösung fortfahren möchten, denke ich, dass Sie beide Wege verwenden können, können Sie einen generischen Repo erstellen, der wird Haben Sie alle Code verwendet, um Daten zu bekommen, dann können Sie darüber eine spezifische Ebene, die Methoden zum Abrufen jedes Auto durch seinen Typ

012 verfügbar macht

Generisches Repo

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

ich mit etwas einfacher gehen würde. Kein Polymorphismus basierend auf Marke, denn es ist nur ein Etikett, es fügt kein Verhalten hinzu:

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; 
    } 
} 
Verwandte Themen