实现一个调用接口方法的类?

时间:2013-04-18 16:21:52

标签: java generics interface abstraction

我真的在寻找答案。我想创建一个只是遍历目录树的通用代码。也许它只是一个包含一个方法的静态类。没问题。对于不是目录的每个文件,它都会 。我认为为这个某事定义一个接口是要做的事情(我现在称之为FileActionInterface.performAction()),但我不知道如何编写目录walker代码来调用它接口方法(尚不存在)。我已经看到并使用了其他Java类,它们的方法是“添加接口处理程序()”,然后该类将运行您实现的接口。如果你什么都不放,没有任何反应。

很抱歉在这里抓住正确的话。如何编写此目录步行器代码以调用抽象代码?

PS 所有这些都是很好的答案,我已经标记了它们。当类有一个类似于方法的“addInterfaceHandler()”时,它们是如何做到的?我猜这个类有它自己的接口实现,但它可能是空的。然后,当您调用add()方法时,您要么替换类的实现,要么像接口实现的数组一样添加它。

我会开始尝试你的不同解决方案。

4 个答案:

答案 0 :(得分:1)

您将传入实现所述接口的对象。

walk方法会在该对象上调用该方法。

类似于Files.walkFileTreeFileVisitor的合作方式。

非常粗略:

public class Walker {
    private Visitor v;
    public Walker(Visitor v) { this.v = v; }
    public walk(File dir) {
        // pseudo-code
        for (File f : dir.getFiles()) {
            if (f.isDir()) {
                walk(f);
            } else {
                v.performAction(f);
            }
        }
    }
}

答案 1 :(得分:1)

class DirIterator

  interface Callable
    method callback(file) // abstract
  end interface 

  method iterate (dir, callable) {
    for each file in dir
      if (file is Folder) then iterate(file, callable)
      else callable.callback(file)
  }

  // example use
  method main() {
    callable = new Callable{callback(file) {print(file.name)}}; // specify cb for this iteration
    dirIterator.iterate("root_dir_to_iterate/", callable); // start iteration
  }
end class

答案 2 :(得分:1)

作为一种简单的静态方法:

static public walkTree(File dir, Visitor vis) {
    for(File fil: dir.getFiles()) {
        if(fil.isDirectory()) { walkTree(f,vis);      }
        else                  { vis.performAction(f); }
        }
    }

(假设Visitor有一个performAction方法。)

答案 3 :(得分:1)

你会写两种类型。第一个是一个接口,它声明了一个人如果想要使用你的walker就必须实现的方法。

public interface FileAction {

  void perform(File file) throws IOException;

}

另一个是步行者本身:

public final class FileWalker {

  public void scan(File directory, FileAction action) throws IOException {
    if (!directory.isDirectory())
      throw new IllegalArgumentException("Not a directory.");
    File[] sub = directory.listFiles();
    if (sub == null)
      throw new FileNotFoundException("Failed to list directory contents.");
    for (File f : sub) {
      if (f.isDirectory())
        scan(f, action);
      else
        /* This is where you invoke the implementation of the interface. */
        action.perform(f);
    }
  }

}

您的用户将实现您声明的界面。它可以在perform()方法的实现中做任何他们需要的事情,这将由你的文件管理器调用:

final class SizeCalculator implements FileAction {

  private long total = 0;

  @Override
  public void perform(File file) {
    total += file.length();
  }

  long getTotal() {
    return total;
  }

}

然后他们一起使用他们的对象和你的对象:

final class Test {

  public static void main(String[] argv) throws IOException {
    SizeCalculator sizer = new SizeCalculator();
    FileWalker walker = new FileWalker();
    File cwd = new File("");
    walker.scan(cwd, sizer);
    System.out.printf("Directory contains %d bytes.%n", sizer.getTotal());
  }

}

如果您使用的是Java 7,并且您的应用程序实际上正在遍历文件树,则应使用NIO.2 API来遍历文件树。这里,要实现的接口是核心Java库声明的FileVisitor接口。

相关问题