2014-04-08 7 views
16

Mam powtarzający się problem przy użyciu Eclipse. Rozważmy następujący przykład:Jak mogę uniemożliwić Eclipse dostarczanie nieaktualnych klas podczas importowania?

Organize imports with deprecated class

Jak widać mam wciśnięty Ctrl + SHIFT + O. Mogę wybrać niezauważoną nieaktualną i niezastrzeżoną adnotację. Mój problem polega na tym, że często jestem zaopatrywany w dziesiątki klas, a połowa z nich jest przestarzała (doskonałym przykładem są klasy JUnitAssert).

Moje pytanie brzmi: w jaki sposób mogę dokonać Eclipse ignorować wszystkie nieaktualnych zajęcia przy organizowaniu importu?

Odpowiedz

13

Obecnie Eclipse nie zapewnia takiej opcji ... Eclipse Documentation for Organise Imports (Kepler version).

Jednak z krówki można osiągnąć ten sam rezultat ...

Eclipse pozwala dostarczyć listę zajęć/pakietów do filtrowania-out. Aby to zrobić, przejdź do Preferencje> Wpisz filtry.

Preferences for Type Filters

Robiłem to w moim otoczeniu, aby zapewnić „java.awt.List” nie sugeruje się, kiedy naprawdę chcesz „java.util.List”.

To, czego chcesz, to dodać wszystkie nieaktualne klasy do tej listy.

Lista ta jest utrzymywana w Eclipse preferencje obszaru roboczego ...

File ... C:\Users\[YOUR_USER_NAME]\workspace\.metadata\.plugins\org.eclipse.core.runtime\.settings\org.eclipse.jdt.ui.prefs 
Property ... org.eclipse.jdt.ui.typefilter.enabled=java.awt.List; 

Wszystko, co jest wymagane jest, aby utworzyć listę nieaktualnych klas i zapisać go w pliku ogłoszenia.

Eclispe może pomóc w utworzeniu tej listy ... Wykonaj "Wyszukiwanie Java" dla "Przestarzałe". Search for Deprecated classes

Następnie grupuj wyniki według typu. enter image description here

i skopiować wyniki przy użyciu „Copy Nazwa kwalifikowany”

Wyniki będą zawierać Generics, co powinno zostać usunięte. Na przykład "javafx.scene.control.Cell <T>" powinien przeczytać "javafx.scene.control.Cell".

Oprócz zawierających nieaktualne klasy, wyniki będą również zawierać dowolną klasę, która ma wyraz "Przestarzałe". Może to być komentarz lub adnotacja metody. Ta lista będzie musiała być filtrowana, aby zachować tylko przestarzałe klasy.

Poniższy skrypt przetwarza tę listę klas, aby usunąć generyczne i odfiltrować klasy, które nie są nieaktualne (tzn. Ma tylko wycofanie metod).Lista klas jest odczytywana z pliku o nazwie "DeprecatedClassList.txt". Gdy nie można sprawdzić adnotacji klasy, pomija klasę i drukuje ją (do ręcznego sprawdzania).

import java.lang.annotation.Annotation; 
import java.nio.file.Files; 
import java.nio.file.Paths; 
import java.util.List; 
import java.util.Optional; 
import java.util.stream.Collectors; 
import java.util.stream.Stream; 

public class ConfigurationGenerator { 

    public static void main(String[] args) throws Exception { 

     List<String> cleanedList = Files 
       .readAllLines(Paths.get("DeprecatedClassList.txt")).stream() 
       .map(ConfigurationGenerator::removeGenerics) 
       .filter(ConfigurationGenerator::hasDeprecatedConstructor) 
       .collect(Collectors.toList()); 

     String propertyName = "org.eclipse.jdt.ui.typefilter.enabled="; 
     String propertyValue = String.join(";", cleanedList).concat(";"); 

     String configuration = propertyName + propertyValue; 
     System.out.println("Configuration property..."); 
     System.out.println(configuration); 
    } 

    public static String removeGenerics(String className) { 
     int openingBracket = className.indexOf("<"); 
     if (openingBracket == -1) 
      return className; 
     else 
      return className.substring(0, openingBracket); 
    } 

    public static boolean hasDeprecatedConstructor(String className) { 

     Class theClass = null; 
     try { 
      theClass = Class.forName(className); 
     } catch (Throwable e) { 
      // Ignore bad results 
      System.out.println("Skipping: " + className); 
      return false; 
     } 

     Annotation[] annotations = theClass.getAnnotations(); 
     Optional<Annotation> deprecatedConstructor = Stream 
       .of(annotations) 
       .filter(annotation -> annotation.toString().equals(
         "@java.lang.Deprecated()")).findAny(); 

     return deprecatedConstructor.isPresent(); 
    } 
} 

Jest jednak jeden problem z tym podejściem. Możesz użyć nieaktualnej klasy, gdy nie-nieaktualna wersja nie istnieje. Nie zobaczysz wycofanej klasy, jeśli została celowo ukryta. Aby rozwiązać ten problem, po prostu upewnij się, że wykluczyłeś je z filtra.

Powiązane problemy