2016-05-25 28 views
0

Ich schreibe gerade einen XML-Konverter für ein Supply-Chain-Projekt. Wir verwenden Anfragen und Bestellungen.Verwendung Methode des generischen Typs

Der Konverter hat mehrere Methoden, die zur Zeit dasselbe tun, aber separat für Anfragen und Bestellungen implementiert werden.

ich geschaffen habe daher eine abstrakte Klasse Wartbarkeit des Codes zu verbessern und einen generischen Typen verwendet:

public abstract class AbstractConverter<T extends BusinessObject> 

Dann habe ich die spezifischen Implementierungen für den eigentlichen Wandler

public class OrderConverter extends AbstractConverter<Order> 
public class RequestConverter extends AbstractConverter<Request> 

Wie gesagt , Ich habe mehrere Methoden in den zwei spezifischen Klassen, die im Grunde dasselbe tun, also möchte ich sie natürlich in der abstrakten Klasse haben. Ich habe hinzugefügt nun die folgende Methode die abstrakte Klasse:

protected Comment createComment(T obj) { 
    String remark; 
    if (obj instanceof Order) { 
     remark = ((Order) obj).getRemark(); 
    } else if (obj instanceof Request) { 
     remark = ((Request) obj).getRequestRemark(); 
    } else { 
     throw new IllegalArgumentException("This method does not support objects of the type " + obj.getClass().toString()); 
    } 
    return new Comment(remark); 
} 

Meine Frage ist nun: ist dies der Weg zu gehen, oder gibt es eine elegantere Möglichkeit Generika in diesem Zusammenhang zu benutzen?

Ich brauche das gelöst, aber ich möchte auch guten Stil verwenden.

+0

Was bedeutet "im Wesentlichen" bedeuten? Es gibt kein "ein bisschen schwanger". Sie sind die gleichen, dann ziehen sie sie in die abstrakte Klasse oder sie sind nicht, dann implementieren Sie sie separat (siehe Weros Antwort). Steigende Komplexität und Unerreichbarkeit durch die Einführung von if/else/instance von Blöcken ist IMHO wirklich eine schlechte Idee. – Fildor

Antwort

3

Die natürliche objektorientierte Lösung ist createComment eine abstrakte Methode

protected abstract Comment createComment(T obj); 

und lassen Sie die Subklassen es implementieren zu machen:

public class OrderConverter extends AbstractConverter<Order> { 
    protected Comment createComment(Order order) { 
      return new Comment(order.getRemark()); 
    } 
} 

public class RequestConverter extends AbstractConverter<Request> { 
    protected Comment createComment(Request request) { 
      return new Comment(request.getRequestRemark()); 
    } 
} 
2

Ich würde vorschlagen, die getRemark Methode zu einer Schnittstelle, die sowohl Request und Order implementiert.

Auf diese Weise können Sie einfach überprüfen, ob das eingehende generische Objekt eine Instanz der Schnittstelle ist.

protected Comment createComment(T obj) { 
    if (obj instanceof Remarkable) { 
     return new Comment(((Remarkable) obj).getRemark()); 
    } 
    throw new IllegalArgumentException("This method does not support objects of the type " + obj.getClass().toString()); 
} 
+1

... und Sie können sogar diese 'instanceof' überspringen, wenn es möglich ist, dass' BusinessObject' auch diese 'Remarkable' Schnittstelle implementiert. –

+3

@DaDaDom dann gibt es keine Verwendung einer Schnittstelle. Wenn alle 'BusinessObject'-Kommentare zurückgegeben werden können, verwenden Sie einfach eine abstrakte Methode in dieser Klasse. –

+0

Danke für diesen Eingang. Leider kann ich dies nicht tun, da ich die Bestell- und Anfrageklassen nicht ändern kann, da dies einen sehr großen Refactorinf des bestehenden Codes bedeuten würde. –

Verwandte Themen