Üzerinde çalıştığım bir proje yakın zamanda Java 7'den Java 8'e geçmiştir. İşlevsel arayüzleri kod tabanımıza yerleştirmek için aday olarak tek bir soyut yönteme sahip arayüzleri bulmak istiyorum. (Mevcut arabirimleri @FunctionalInterface
olarak ekleyerek, java.util.function
numaralı arabirimden genişleterek veya yalnızca değiştirerek).Tek bir yöntemi olan arabirimler için java kod tabanını nasıl arayabilirim?
cevap
reflections proje bulmak ve üzerinde sınıf tüm sınıfları iade edebilir.
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);
isObjectMethod
yardımcı böyle tanımlanır::
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()));
}
Bu, geri kaynak kodu gidip, açıklama ekleme yardımcı olmuyor, ama size vereceğiz İşte çalışan bir örnektir çalışmak için bir liste.
Arayüz, "Karşılaştırıcı" gibi bir "Nesne" yöntemini geçersiz kılarsa ne olur? Daha sonra, yöntem filtrelenmelidir. Ve 'statik 'yöntemleri de kaldırılmalıdır. Ya da daha iyisi, filtrenin sadece 'soyut' yöntemlerden geçmesine izin verin. Arrays.stream (c.getMethods()) 'yerine 'stream (spliterator (c.getMethods(), 0), false' kullanmak için bir neden var mı? (-> Modifier.isAbstract (m.getModifiers()) m) 'yerine' .filter ait – Holger
yorumlarınızla birlikte –
Neden '.filter güncellenmiş (m -> m.isDefault()!) (Filtrelemek m -.>! Modifier.isStatic (m.getModifiers())) '? – Holger
- 1. Perl'de, bir dizede sahip olduğum bir yöntemi nasıl arayabilirim?
- 2. Spring HandlerInterceptor'dan bir Handler'da çağrılan yöntemi nasıl arayabilirim?
- 3. Akıcı Arabirimler - oluşturulmakta olan nesne sayısı
- 4. TFS 2010'daki bir değişiklik kümesindeki tek tek dosyalar için kod karma bilgisini nasıl programlı olarak arayabilirim?
- 5. jenerik arabirimler için soyut başvurular
- 6. Java jenerik, arabirimler ve tip kısıtlamalar
- 7. Jeneriği olan kod,
- 8. Nesnede bir değeri nasıl arayabilirim?
- 9. DTO'lar ve arabirimler
- 10. Aynı dinlenme bitiş noktası olan iki java yöntemi
- 11. Java yöntemi,
- 12. Bir mac verilen arabirimler nasıl yazdırılır?
- 13. Uyumsuz Arabirimler Uygulamak
- 14. Java - döngü için ölü kod
- 15. Android'de Twitter için OAuth'u nasıl arayabilirim?
- 16. Kod kütüphanesi için Java kütüphanesi
- 17. Hamquent'i nasıl arayabilirim?
- 18. Bir işlev için bir hackage paketini nasıl arayabilirim?
- 19. Primefaces'te bir veri tabanını filtreleyen olayı nasıl yakalayabilirim
- 20. Python'dan erlang'ı nasıl arayabilirim?
- 21. Tek bir String'e teller nasıl eklenir, Java?
- 22. ortak bir int yazarak compareTo() yöntemi java
- 23. Arabirimler ve JPA ile çalışma nasıl yapılır
- 24. Bir modülden bir modülü nasıl arayabilirim?
- 25. Aşırı yüklenme olan geçersiz kılma yöntemi nasıl aranır?
- 26. SSIS paketi nasıl arayabilirim?
- 27. vim - Tamponları nasıl arayabilirim?
- 28. MemberwiseClone() öğesini nasıl arayabilirim?
- 29. Veri kümesi şemasında veri tabanını nasıl sıralayabilirim
- 30. Java Tek Bir Olay İçin Tek Bir Olay Kaynağı için Çoklu Olay Dinleyicilerini Salıncak
Bu, IntelliJ'de bir inceleme olarak kullanılabilir. Yalnızca bu incelemeye sahip bir denetim profili oluşturun ve projenizde çalıştırın. –
Bu değişiklik, duruma göre bir analiz gerektireceğinden ve ek açıklama eklemenin yanı sıra, diğer 2 çözümün de her ikisinin de önemli bir refactoring gerektirmesi gerekir. Bir kütüphane tasarlamıyorsanız, ek açıklama eklemek çok fazla bir değer sağlamamaktadır, çünkü lambda uygulamalarına sahip bir arabirimi işlevsel olmayan birine dönüştürürseniz derleme sorunlarını hızlı bir şekilde göreceksiniz. –