2014-04-08 15 views
16

Tôi gặp sự cố lặp lại khi sử dụng Eclipse. Hãy xem xét ví dụ sau:Làm cách nào để ngăn không cho Eclipse cung cấp các lớp không dùng nữa khi nhập?

Organize imports with deprecated class

Như bạn có thể thấy tôi đã ép Ctrl +phím Shift +O. Tôi có thể chọn từ một chú thích không được chấp nhậnkhông được dùng nữa. Vấn đề của tôi là tôi thường được cung cấp với hàng chục lớp và một nửa trong số đó không được dùng nữa (ví dụ hoàn hảo là các lớp học JUnitAssert).

Câu hỏi của tôi là làm cách nào để tôi có thể thực hiện Eclipse bỏ qua tất cả các lớp không dùng nữa khi tổ chức nhập?

Trả lời

13

Hiện tại, Eclipse không cung cấp tùy chọn như vậy ... Eclipse Documentation for Organise Imports (Kepler version).

Tuy nhiên, với một kẹo mềm bạn có thể đạt được kết quả tương tự ...

Eclipse cho phép bạn để cung cấp một danh sách các lớp/gói để lọc ra. Để thực hiện việc này, hãy điều hướng đến Tùy chọn> Loại bộ lọc.

Preferences for Type Filters

Tôi đã làm điều này trong môi trường của tôi để đảm bảo "java.awt.List" không được đề nghị khi tôi thực sự muốn "java.util.List".

Điều bạn muốn là thêm tất cả các lớp không dùng nữa vào danh sách này.

Danh sách này được duy trì trong tùy chọn không gian làm việc của bạn thực ...

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; 

Tất cả những gì được yêu cầu là bạn tạo ra một danh sách các lớp phản đối, và lưu nó trong tập tin thuộc tính này.

Eclispe có thể giúp tạo danh sách này ... Thực hiện "Tìm kiếm Java" cho "Không được chấp nhận". Search for Deprecated classes

Sau đó nhóm kết quả theo loại. enter image description here

Và sao chép các kết quả sử dụng "Copy Qualified Name"

Kết quả sẽ chứa Generics, và điều này cần được loại bỏ. Ví dụ: "javafx.scene.control.Cell <T>" nên đọc "javafx.scene.control.Cell".

Ngoài việc chứa các lớp không dùng nữa, kết quả cũng sẽ chứa bất kỳ lớp nào có từ "Không được chấp nhận". Đây có thể là chú thích hoặc chú thích phương thức. Danh sách này sẽ cần được lọc để chỉ giữ lại các lớp không dùng nữa.

Tập lệnh dưới đây xử lý danh sách lớp học này để loại bỏ generics và lọc ra các lớp không bị phản đối (nghĩa là, chỉ có phương thức không dùng nữa).Danh sách lớp được đọc từ một tệp có tên "DeprecatedClassList.txt". Khi nó không thể kiểm tra chú thích lớp, nó bỏ qua lớp và in nó ra (để kiểm tra thủ công).

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(); 
    } 
} 

Có một vấn đề với cách tiếp cận này. Bạn có thể muốn sử dụng lớp không được dùng nữa khi phiên bản không được chấp nhận không tồn tại. Bạn sẽ không thấy lớp không được dùng nữa nếu nó đã được cố ý ẩn. Để giải quyết điều đó, chỉ cần chắc chắn bạn loại bỏ chúng khỏi bộ lọc.

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