2013-02-25 25 views
6

Thực tiễn tốt nhất khi tạo function objects (đối tượng không quốc tịch xuất một phương thức hoạt động trên các đối tượng khác) trong Java là gì?Cách tốt nhất để xuất các đối tượng hàm trong Java là gì?

+1

Bạn có thể nhận được một số cảm hứng bằng cách nhìn vào 'Comparator' giao diện: http://docs.oracle.com/javase/6/docs /api/java/util/Comparator.html. Đây là một câu hỏi mở. –

+2

có thể trùng lặp của [Thay thế gần nhất cho một con trỏ hàm trong Java là gì?] (Http://stackoverflow.com/questions/122407/whats-the-nearest-substitute-for-a-function-pointer-in-java) – Raedwald

Trả lời

5

Đó là bài học để xem xét các forthcoming Java 8 functional interfaces

Java 8 thư viện lớp có một gói phần mềm mới, java.util.functions, mà chứa một số giao diện chức năng mới. Nhiều trong số này có thể được sử dụng với API bộ sưu tập.

Nếu bạn làm theo các mẫu được trình bày ở đây, bạn sẽ có giao diện chức năng (giao diện hỗ trợ một phương pháp) và triển khai không có thành viên. Đối tượng hàm của bạn không nên gọi bất kỳ phương thức nào trên các đối số phương thức có thể thay đổi trạng thái của chúng (tức là các hiệu ứng phụ hiện diện). Thật không may là bạn không thể thực thi điều đó - bạn phải dựa vào quy ước cho điều này.

+0

điều này có thể được thực thi với các ngôn ngữ chức năng không? – Geek

+0

Tôi tin rằng ngôn ngữ thực thi bất biến có thể thực thi điều này. Có lẽ cũng C++ và ngữ nghĩa const mạnh mẽ của nó, mặc dù tôi không muốn được trích dẫn về điều này! –

3

Java là ngôn ngữ lập trình hướng đối tượng, vì vậy hãy sử dụng mẫu thiết kế Chiến lược.

+1

Trong khi các chiến lược hoạt động ở đây, không cần một đối tượng chiến lược để thực hiện chỉ một phương thức, vì một đối tượng chức năng sẽ yêu cầu –

2

Java8 nên có lambdas để dễ dàng tạo ra các triển khai giao diện chức năng. Trước khi Java8 bạn có thể nhìn vào những gì các ổi thư viện cung cấp: Functional Explained

Dưới đây là một đoạn trích của tài liệu:

Ổi cung cấp hai cơ bản "chức năng" giao diện: Chức năng, trong đó có phương pháp B đơn áp dụng (Một đầu vào). Các thể hiện của hàm thường được cho là có tính minh bạch tham chiếu - không có các tác dụng phụ - và nhất quán với các bằng, nghĩa là, a.equals (b) ngụ ý rằng hàm.apply (a) .equals (function.apply (b)). Predicate, có áp dụng phương thức boolean đơn (đầu vào T). Các trường hợp của Predicate thường được dự kiến ​​là không có tác dụng phụ và phù hợp với bằng.

0

Ok sau khi nhận xét, đây là câu trả lời: Không có cách nào dễ dàng/thuận tiện để chuyển một hàm.

Hầu hết thời gian bạn sẽ khai báo một lớp bên trong mà thực hiện một giao diện giống như ví dụ, Comparator: http://docs.oracle.com/javase/6/docs/api/java/util/Comparator.html

Thực tế là chức năng không thể được thông qua như các tham số đã dẫn đến rất nhiều cái gọi là các mẫu thiết kế , nơi bạn truyền xung quanh các lớp/các giao diện đối tượng mà khai báo có các hàm đó.

Như đã đề cập bởi cuộc sống những người khác sẽ nhận được một chút dễ dàng hơn với Java 8.

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