2015-07-16 12 views
6

Ho due oggetti nel seguente modointerfaccia Java migliori pratiche

public class ObjectA { 
int id ; 
String name; 
} 

public class objectB { 
    Long id; 
    String name; 
} 

voglio essere in grado di creare un'interfaccia 'anObject' che sarà attuato da questi due oggetti. Come sarebbe questa interfaccia?

public interface AnObject { 
    public <type?> getId() ; 
    public String getName(); 
} 

Quale deve essere il tipo nel getter per ID?

risposta

12

Prima di tutto, non nominarlo Object. Object è la classe di base implicita di Java per tutte le altre classi. Tecnicamente, potresti nominare la tua interfaccia Object se non la inserisci nel pacchetto java.lang, ma sarebbe altamente fuorviante.

Per fornire diversi tipi di ritorno per getId() in ObjectA e ObjectB, l'uso dei farmaci generici:

public interface MyObject<T> { 
    T getId(); 
    String getName(); 
} 

public class ObjectA implements MyObject<Integer> { 
    @Override 
    public Integer getId() { 
    return 0; 
    } 

    @Override 
    public String getName() { 
    return "A"; 
    } 
} 

public class ObjectB implements MyObject<Long> { 
    @Override 
    public Long getId() { 
    return 0; 
    } 

    @Override 
    public String getName() { 
    return "B"; 
    } 
} 

Se getId() restituisce sempre un numero, si potrebbe anche definire come MyObjectMyObject<T extends Number>. Si noti che non è possibile utilizzare i tipi nativi int e long con generici; devi usare i tipi scatolati Integer e Long.

+1

Grazie Robin, questo è utile. La parola chiave 'Oggetto' era solo per esempio –

+2

Possiamo migliorare questa soluzione aggiungendo l'interfaccia pubblica MyObject 'come ci aspettiamo che il tipo' T' sia un numero. –

+0

@ piotr.wittchen Hai ragione; dai un'occhiata all'ultimo paragrafo della mia risposta. ;) –

0

Supponendo che il proprio ID sia sempre un numero.

Se l'utente del getter getId() non si occupa (o non dovrebbe) di occuparsi del tipo effettivo del valore restituito, è possibile utilizzare direttamente Number, senza generici. Dipende dal contesto se vuoi usare i generici o meno. Un vantaggio di non utilizzando i generici in questo caso sarebbe che non è necessario definire il tipo effettivo dell'ID, il che rende il codice di chiamata meno accoppiato all'implementazione di MyObject.

public interface AnObject { 
    public Number getId() ; 
    public String getName(); 
} 

Il codice che chiama questo, non conoscere il tipo effettivo del Id. Tuttavia possono ancora essere sicuri che si tratta di un numero e possono chiamare cose come Number.doubleValue() o Number.longValue() come richiede il codice di chiamata.