2013-07-22 45 views
29

Một số ngày trước, chúng tôi đã chuyển sang Java 7 trong Công ty của tôi - cuối cùng! Jay \ o/Vì vậy, tôi đã tìm hiểu về lớp học Objects và đã ngạc nhiên khi các phương pháp hashCode()equals() được nhận ra, giảm rất nhiều mã boylerplate so với những cái được tạo ra bởi nhật thực mỗi mặc định (ALT + SHIFT + S -> H).Làm thế nào để dạy eclipse để tạo nhỏ gọn bằng() và hashCode() từ lớp jdk 7 Objects?

Tôi đã tự hỏi liệu tôi có thể thay đổi hành vi mặc định của nhật thực được tạo ra hashCode()equals() không?

Tôi rất muốn thấy điều này:

@Override 
public int hashCode() 
{ 
    return Objects.hash(one, two, three, four/*, ...*/); 
} 

thay vì điều này:

@Override 
public int hashCode() 
{ 
    final int prime = 31; 
    int result = 1; 
    result = prime * result + ((one == null) ? 0 : one.hashCode()); 
    result = prime * result + ((two == null) ? 0 : two.hashCode()); 
    result = prime * result + ((three == null) ? 0 : three.hashCode()); 
    result = prime * result + ((four== null) ? 0 : four.hashCode()); 
    // ... 
    return result; 
} 

Cũng vậy với equals(). This is the article Tôi nhận được từ này.

Bất kỳ ý tưởng nào để nhận ra điều này tốt nhất?

+0

Đối với "Generate toString()" người ta có thể xác định một mẫu trên trang Wizzard. Bạn nên nộp một vé tại [eclipse-bugzilla] (https://bugs.eclipse.org/bugs/) có lẽ họ thêm một cái gì đó tương tự cho eq + hashcode trong tương lai. Nếu bạn làm như vậy xin vui lòng giống như vé, vì vậy tất cả mọi người quan tâm có thể upvote nó! – Chriss

+0

Bạn cũng có thể gấp hàm 'hashCode()' nếu bạn không muốn thấy nó. Tôi nghĩ rằng có thể là một ý tưởng tốt để xem xét liệu việc triển khai mặc định có phải là những gì bạn muốn trong tất cả các trường hợp có thể xảy ra trong tương lai hay không. Theo mặc định cho biểu thức viết tắt, bạn sẽ cho phép bạn linh hoạt trong việc tinh chỉnh 'hashCode' (không thể đảo ngược tất nhiên), nếu bạn muốn/cần làm như vậy. Xem http://stackoverflow.com/questions/12076846/using-a-larger-prime-as-a-multiplier-when-overriding-hashcode để thảo luận về hàm băm. – posdef

+0

Tôi đã đăng nhập tăng cường này. Bình chọn cho nó! https://bugs.eclipse.org/bugs/show_bug.cgi?id=424214 –

Trả lời

4

Trong các tùy chọn Eclipse, hãy chuyển đến Java> Trình soạn thảo> Mẫu.

Ở đó bạn có thể tạo mẫu mới. Mẫu có thể trông giống như:

@Override 
public int hashCode() 
{ 
    return Objects.hash(one, two, three, four/*, ...*/); 
} 

Tôi không chắc liệu có biến nào sẽ liệt kê đúng trường của bạn hay không.

Bạn có thể muốn nhìn vào some further explanations on these templates

+7

Thật không may là hệ thống mẫu không hỗ trợ liệt kê các trường (tương tự như ** $ {enclosing_method_arguments} **, nó có thể có _ $ {enclosing_type_fields} _ nếu nó tồn tại). Ngay cả khi bạn viết một mẫu để tự động tạo ra bản mẫu soạn sẵn, bạn vẫn sẽ phải tự điền vào các tên trường bên trong phương thức 'hash()'.Và tôi không biết tại sao hashCode và bằng mẫu không được liệt kê trong _Java> Kiểu mã> Mẫu mã _... – ADTC

2

Có một plugin mới có sẵn mà có thể tạo ra các phương pháp toString(), hashCode(), tương đương với() sử dụng java 7 tính năng, thư viện lang apache chung, thư viện ổi. Nó có các tính năng tùy biến tốt. Vui lòng tìm liên kết bên dưới để cài đặt plugin. Sau khi cài đặt, chỉ cần click chuột phải -> Jenerate -> tùy chọn khác nhau

Liên kết - https://marketplace.eclipse.org/content/jenerate

+0

Thật không may, plugin này có lỗi, nó không tạo hashCode và bằng đúng nếu bạn có một lớp siêu. –