2015-07-16 25 views
6

Tôi có hai đối tượng theo cách sauJava giao diện thực hành tốt nhất

public class ObjectA { 
int id ; 
String name; 
} 

public class objectB { 
    Long id; 
    String name; 
} 

Tôi muốn để có thể tạo ra một giao diện 'anObject' đó sẽ được thực hiện bởi hai đối tượng này. Giao diện này trông như thế nào?

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

Loại nên ở trong getter cho ID?

Trả lời

12

Trước hết, không đặt tên là Object. Object là lớp cơ sở ngầm của Java cho tất cả các lớp khác. Về mặt kỹ thuật, bạn có thể đặt tên cho giao diện của mình là Object miễn là bạn không đặt nó trong gói java.lang, nhưng điều đó sẽ gây hiểu lầm cao.

Cung cấp các loại khác nhau trở lại cho getId() trong ObjectAObjectB, Generics sử dụng:

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

Nếu getId() luôn trả về một số, bạn cũng có thể xác định MyObject như MyObject<T extends Number>. Lưu ý rằng bạn không thể sử dụng các loại gốc intlong với các loại thuốc generic; bạn phải sử dụng các loại đóng hộp IntegerLong.

+1

Cảm ơn Robin, điều đó hữu ích. Từ khóa 'Object' chỉ là ví dụ –

+2

Chúng ta có thể cải thiện giải pháp này bằng cách thêm 'public interface MyObject ' vì chúng ta mong đợi kiểu 'T' là một số. –

+0

@ piotr.wittchen Bạn nói đúng; hãy xem đoạn cuối của câu trả lời của tôi. ;) –

0

Giả sử rằng id của bạn luôn là số.

Nếu người sử dụng của bạn getter getId() không (hoặc không nên) quan tâm đến loại thực tế của giá trị trả lại bạn cũng có thể sử dụng trực tiếp Number, không có generics. Nó phụ thuộc vào bối cảnh nếu bạn muốn sử dụng Generics hay không. Lợi thế của không phải là sử dụng Generics trong trường hợp này là bạn không phải xác định loại id thực tế, điều này làm cho mã gọi điện ít đi đôi với việc triển khai MyObject.

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

Mã gọi này sẽ không biết loại ID thực tế. Tuy nhiên, họ vẫn có thể chắc chắn rằng đó là một số và có thể gọi những thứ như Number.doubleValue() hoặc Number.longValue() khi mã gọi điện yêu cầu.

Các vấn đề liên quan