2015-07-16 5 views
6

У меня есть два объекта следующим образоминтерфейс Java лучшая практика

public class ObjectA { 
int id ; 
String name; 
} 

public class objectB { 
    Long id; 
    String name; 
} 

Я хочу, чтобы иметь возможность создать интерфейс «AnObject», который будет реализован этими двумя объектами. Как бы выглядел этот интерфейс?

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

Какой должен быть тип в геттере для ID?

ответ

12

Прежде всего, не назовите его Object. Object - неявный базовый класс Java для всех других классов. Технически вы могли бы назвать свой интерфейс Object, если вы его не поместите в пакет java.lang, но это было бы очень вводить в заблуждение.

Для обеспечения различных типов возврата для getId() в ObjectA и ObjectB, использование дженериков:

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

Если getId() всегда возвращает число, вы можете также определить, как MyObjectMyObject<T extends Number>. Обратите внимание, что вы не можете использовать собственные типы int и long с дженериками; вы должны использовать в штучной упаковке типы Integer и Long.

+1

Спасибо, Робин, это полезно. Ключевое слово «Объект» было просто, например, –

+2

Мы можем улучшить это решение, добавив 'public interface MyObject ', поскольку мы ожидаем, что тип 'T' будет числом. –

+0

@ piotr.wittchen Вы правы; взгляните на последний параграф моего ответа. ;) –

0

Предполагая, что ваш идентификатор всегда является числом.

Если пользователь вашего получателя getId() не (или не должен) заботиться о фактическом типе возвращаемого значения, вы также можете использовать Number напрямую, без генериков. Это зависит от контекста, если вы хотите использовать дженерики или нет. Преимущество не с использованием дженериков в этом случае будет заключаться в том, что вам не нужно определять фактический тип идентификатора, что делает код вызова менее связанным с реализацией MyObject.

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

Код, который называет это, не будет знать фактический тип идентификатора. Однако они все еще могут быть уверены, что это номер и могут называть такие вещи, как Number.doubleValue() или Number.longValue(), как это требует код вызова.

Смежные вопросы