Một dự án tôi làm việc gần đây đã chuyển từ Java 7 sang Java 8. Tôi muốn có thể tìm thấy các giao diện có một phương thức trừu tượng đơn lẻ làm ứng viên giới thiệu các giao diện chức năng vào cơ sở mã của chúng tôi. (Chú thích các giao diện hiện có dưới dạng @FunctionalInterface
, mở rộng chúng từ các giao diện trong java.util.function
hoặc có thể chỉ thay thế chúng).Làm cách nào tôi có thể tìm kiếm một cơ sở mã java cho các giao diện có một phương thức đơn lẻ?
Trả lời
Dự án reflections có thể định vị và trả lại tất cả các lớp trên đường dẫn lớp. Dưới đây là một ví dụ làm việc:
ReflectionUtils.forNames(new Reflections(new ConfigurationBuilder().setScanners(new SubTypesScanner(false))
.addUrls(ClasspathHelper.forClassLoader()))
.getAllTypes()).stream()
.filter(Class::isInterface)
.collect(toMap(c -> c,
c -> Arrays.stream(c.getMethods())
.filter(m -> !m.isDefault())
.filter(m -> !Modifier.isStatic(m.getModifiers()))
.filter(m -> !isObjectMethod(m))
.collect(toSet())))
.entrySet().stream()
.filter(e -> e.getValue().size() == 1)
.sorted(comparing(e -> e.getKey().toString()))
.map(e -> e.getKey().toString() + " has single method " + e.getValue())//getOnlyElement(e.getValue()))
.forEachOrdered(System.out::println);
Các helper isObjectMethod
được định nghĩa như thế này:
private static final Set<Method> OBJECT_METHODS = ImmutableSet.copyOf(Object.class.getMethods());
private static boolean isObjectMethod(Method m){
return OBJECT_METHODS.stream()
.anyMatch(om -> m.getName().equals(om.getName()) &&
m.getReturnType().equals(om.getReturnType()) &&
Arrays.equals(m.getParameterTypes(),
om.getParameterTypes()));
}
này không giúp bạn quay trở lại mã nguồn và thêm chú thích, nhưng nó sẽ cung cấp cho bạn một danh sách để làm việc.
Điều gì sẽ xảy ra nếu giao diện ghi đè phương thức 'Đối tượng', như' Trình so sánh'? Sau đó, phương pháp nên được lọc ra. Và các phương thức 'static' cũng phải được loại bỏ. Hoặc tốt hơn, chỉ cho phép bộ lọc chuyển các phương thức 'abstract'. Và có một lý do để sử dụng 'stream (spliterator (c.getMethods(), 0), false)' thay vì 'Arrays.stream (c.getMethods())'? – Holger
cập nhật với ý kiến của bạn –
Tại sao không '.filter (m -> Modifier.isAbstract (m.getModifiers()))' thay vì '.filter (m ->! M.isDefault()). Filter (m ->! Modifier.isStatic (m.getModifiers())) '? – Holger
- 1. C++: Nguồn gốc + Lớp cơ sở triển khai một giao diện đơn lẻ?
- 2. Phương thức giao diện Java Phương pháp: Mỗi lớp có thực hiện một giao diện không?
- 3. Các giao diện thực hiện đơn lẻ có dành cho đơn vị thử nghiệm một antipattern không?
- 4. Tại sao có thể gọi phương thức trên phương thức giao diện Java? [So sánh]
- 5. Chúng ta có thể tự động gọi một phương thức giao diện Java với một tham số chung không?
- 6. Java: mở rộng một lớp và triển khai một giao diện có cùng phương thức
- 7. Làm cách nào để triển khai hai giao diện có phương thức có cùng tên?
- 8. Tại sao có 3 luồng cho một ứng dụng giao diện điều khiển C# đơn lẻ cơ bản?
- 9. Làm cách nào tôi có thể xử lý một phương thức giao diện có thể hoặc không thể không đồng bộ?
- 10. Làm cách nào tôi có thể xác định động một phương thức bí danh cho một phương thức lớp?
- 11. Làm cách nào để thực hiện tìm kiếm Java IDE làm cho tham chiếu phương thức theo lập trình?
- 12. Trong Perl, làm thế nào tôi có thể gọi một phương thức có tên tôi có trong một chuỗi?
- 13. Nhiều giao diện từ một dịch vụ WCF đơn lẻ?
- 14. Làm thế nào tôi có thể nhận/thiết lập các bit riêng lẻ trong một phao?
- 15. Tôi có thể hạn chế phương thức chung cho nhiều giao diện không?
- 16. Tôi có thể khai báo một biến kiểu 'giao thức' trong giao diện Objective-C không?
- 17. Java: Làm cách nào để tìm ra phương thức được ghi đè từ lớp cơ sở?
- 18. Phương thức tĩnh trong giao diện java
- 19. Giao diện có phương thức toString không?
- 20. Làm thế nào tôi có thể tìm thấy tất cả các phương thức gọi một phương thức đã cho trong Java?
- 21. Công cụ nào để xây dựng một giao diện web đơn giản cho cơ sở dữ liệu của tôi
- 22. Làm cách nào để xác định loại trả về của một phương thức giao diện là một giao diện khác?
- 23. Làm cách nào để tìm kiếm chuỗi mờ mà không có cơ sở dữ liệu nặng?
- 24. cách tìm kiếm một từ đã cho từ một cơ sở dữ liệu khổng lồ?
- 25. Làm cách nào để tôi có thể TẮT mã F # này? (Giao diện thông thạo)
- 26. Làm thế nào tôi có thể tìm thấy vị trí của mã nguồn của một phương thức Python tích hợp?
- 27. Tại sao một lớp trừu tượng thực hiện một giao diện có thể bỏ lỡ việc khai báo/thực hiện một trong các phương thức của giao diện?
- 28. Làm cách nào tôi có thể tìm kiếm (thoát) một ký hiệu đô la bằng cách sử dụng ack?
- 29. Làm cách nào để triển khai giao diện Java với các phương thức variadic trong Scala?
- 30. Làm thế nào để truyền một mảng và một phần tử đơn lẻ cho một phương thức nhiều đối số?
Điều này có sẵn dưới dạng kiểm tra trong IntelliJ. Tạo hồ sơ kiểm tra chỉ có kiểm tra này và chạy nó trên dự án của bạn. –
Khi thay đổi này sẽ yêu cầu phân tích từng trường hợp, và ngoài việc bổ sung chú thích, 2 giải pháp kia đều yêu cầu tái cấu trúc quan trọng, tôi sẽ không thực hiện nó. Nếu bạn không thiết kế một thư viện, việc thêm chú thích cũng không cung cấp nhiều giá trị, vì bạn sẽ nhanh chóng thấy các vấn đề biên dịch nếu bạn chuyển đổi giao diện thành một giao diện không hoạt động trong khi nó có triển khai lambda. –