通过使用singleton替换匿名类来减少内存占用量.但需要更多地重构设计

Tha*_*ham 5 java singleton refactoring

所以我有这个反复执行的方法

public static boolean isReady(String dirPath, int numPdfInPrintJob){
    File dir = new File(dirPath);
    String[] fileList = dir.list(new FilenameFilter(){
        public boolean accept(File file, String filename) {
            return (filename.toLowerCase().endsWith(".pdf"));
        }
    });
    if(fileList.length >= numPdfInPrintJob) return true;
    else return false;  
}
Run Code Online (Sandbox Code Playgroud)

使用anonymous class它的这个方法将创建FilenameFilter每次调用的新实例,并且我调用了很多这个方法.所以我想把它anonymous class变成一个singleton.所以我最初的想法是创建一个singleton看起来像这样的新类

public class PdfFileNameFilter implements FilenameFilter{
    private PdfFileNameFilter(){} //non-instantible

    //guarantee to only have one instance at all time
    public static final PdfFileNameFilter INSTANCE = new PdfFileNameFilter();

    public boolean accept(File dir, String name) {
        return (name.toLowerCase().endsWith(".pdf"));
    }
}
Run Code Online (Sandbox Code Playgroud)

我可以再重构一次吗?我也需要做ZipFileNameFilter,也许许多不同的文件扩展名过滤器.不想为每个过滤器创建一个类.我需要更多地重构这个设计.也许interface在这里的某个地方到位.

Pet*_*rey 6

如果您只想减少内存使用量,那么您可以做到

private static final FilenameFilter PDF_FILES = new FilenameFilter(){
    public boolean accept(File file, String filename) {
        return (filename.toLowerCase().endsWith(".pdf"));
    }
}
Run Code Online (Sandbox Code Playgroud)

如果你想创建一个单例,最简单的方法是

public enum PdfFileNameFilter implements FilenameFilter {
    INSTANCE;

    public boolean accept(File dir, String name) {
        return (name.toLowerCase().endsWith(".pdf"));
    }
}
Run Code Online (Sandbox Code Playgroud)

  • +1第一个选项对我来说似乎是最简单的选择.为什么在仅在1类中使用时创建单例. (3认同)