2012-01-20 28 views
8

Nếu tôi có một lớp Person mà thực hiện Comparable (so sánh personA.height để personB.height, ví dụ), là nó có thể sử dụngJava - compareTo và khai thác

personA < personB 

như một sự thay thế cho

personA.compareTo(personB) == -1? 

Có bất kỳ vấn đề nào trong việc thực hiện điều này hoặc tôi có cần phải khai thác quá tải không?

Trả lời

6

Không có quá tải toán tử trong Java. Bạn có thể đến từ một nền C++.

Bạn phải sử dụng phương thức compareTo.

14

Không, không thể sử dụng personA < personB làm phương án thay thế. Và bạn không thể quá tải các toán tử trong Java.

Ngoài ra, tôi khuyên bạn nên thay đổi

personA.compareTo(personB) == -1 

để

personA.compareTo(personB) < 0 

Những gì bạn có bây giờ có thể làm việc cho lớp học của bạn. Tuy nhiên, hợp đồng trên compareTo() là nó trả về giá trị âm khi personA nhỏ hơn personB. Giá trị âm đó không phải là -1 và mã của bạn có thể bị hỏng nếu được sử dụng với một lớp khác. Nó cũng có thể phá vỡ nếu ai đó đã thay đổi phương thức compareTo() của lớp học của bạn thành một triển khai khác - nhưng vẫn tuân thủ - thực hiện.

1

Java không có quá tải toán tử , vì vậy, có, có vấn đề: điều này là không thể.


Có, tất nhiên, một vài overloadings xây dựng trong: các nhà điều hành + hoạt động trên các loại không thể thiếu, các loại dấu chấm động, và trên String s. Nhưng bạn không thể định nghĩa của riêng bạn.

5

Không thể, không; và Java không hỗ trợ quá tải toán tử (bên cạnh quá tải được tích hợp sẵn).

Nhân tiện, thay vì viết == -1, bạn nên viết < 0. compareTo chỉ cần trả về giá trị âm/không/dương, không cụ thể là -1/0/1.

1

Không, "<" sẽ không biên dịch khi được áp dụng cho đối tượng. Ngoài ra, hãy cẩn thận kiểm tra của bạn:

personA.compareTo(personB)==-1 

Các tài liệu API chỉ nói rằng compareTo() trả về một số nguyên âm khi đối tượng là ít hơn so với đối tượng quy định, sẽ không nhất thiết phải là -1. Sử dụng

personA.compareTo(personB) < 0 

để thay thế.

1

Nó không phải là posible, java không cung cấp cho bạn quá tải nhà điều hành.
Nhưng một lựa chọn OO hơn là thêm một phương pháp bên người

public boolean isTallerThan(Person anotherPerson){ 
    return this.compareTo(anotherPerson) > 0; 
} 

nên thay vì viết

if(personA.compareTo(personB) > 0){ 

} 

bạn có thể viết

if(personA.isTallerThan(personB)){ 

} 

IMHO nó là dễ đọc hơn vì nó ẩn chi tiết và nó được thể hiện trong ngôn ngữ miền chứ không phải là các chi tiết cụ thể của java.

+0

+1 Tôi đồng ý với 'isTallerThan', tôi đã nghĩ như vậy. –

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