Java 实现一个调用接口方法的类?
我真的在寻找答案。我想创建一段通用代码,它只遍历目录树。也许它只是一个包含一个方法的静态类。没问题。对于不是目录的每个文件,它都会执行一些操作。我认为应该为这个东西定义一个接口(我现在称它为Java 实现一个调用接口方法的类?,java,generics,interface,abstraction,Java,Generics,Interface,Abstraction,我真的在寻找答案。我想创建一段通用代码,它只遍历目录树。也许它只是一个包含一个方法的静态类。没问题。对于不是目录的每个文件,它都会执行一些操作。我认为应该为这个东西定义一个接口(我现在称它为FileActionInterface.performAction()),但我不确定如何编写目录遍历器代码来调用这个接口方法(它还不存在)。我见过并使用过其他Java类,它们的方法是“addinterfacehandler()”,然后该类将运行您实现的接口。如果你什么也不进来,什么也不会发生 对不起,我在这里
FileActionInterface.performAction()
),但我不确定如何编写目录遍历器代码来调用这个接口方法(它还不存在)。我见过并使用过其他Java类,它们的方法是“addinterfacehandler()”,然后该类将运行您实现的接口。如果你什么也不进来,什么也不会发生
对不起,我在这里找对了词。如何编写这个目录遍历器代码来调用抽象代码
PS
所有这些都是很好的答案,我已经做了标记。当一个类有一个类似“addInterfaceHandler()”的类方法时,他们是怎么做的?我猜这个类有它自己的接口实现,但它可能是空的。然后,当调用add()方法时,可以替换类的实现,或者像添加接口实现数组一样添加到类中
我将开始尝试您的不同解决方案。您将传入一个实现所述接口的对象 walking方法将调用该对象上的方法 类似于如何使用 非常粗略地说:
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);
}
}
}
}
您将传入一个实现所述接口的对象 walking方法将调用该对象上的方法 类似于如何使用 非常粗略地说:
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);
}
}
}
}
作为一种简单的静态方法:
static public walkTree(File dir, Visitor vis) {
for(File fil: dir.getFiles()) {
if(fil.isDirectory()) { walkTree(f,vis); }
else { vis.performAction(f); }
}
}
(假设访问者有一个performation方法。)作为一个简单的静态方法:
static public walkTree(File dir, Visitor vis) {
for(File fil: dir.getFiles()) {
if(fil.isDirectory()) { walkTree(f,vis); }
else { vis.performAction(f); }
}
}
(假设访问者有一个performation方法。)您可以编写两种类型。第一个是一个接口,它声明了一个方法,如果有人想使用您的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());
}
}
如果您使用的是Java7,并且您的应用程序实际上正在遍历文件树,那么您应该使用来遍历文件树。在这里,要实现的接口是由核心Java库声明的接口。您可以编写两种类型。第一个是一个接口,它声明了一个方法,如果有人想使用您的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());
}
}
如果您使用的是Java7,并且您的应用程序实际上正在遍历文件树,那么您应该使用来遍历文件树。这里,要实现的接口是由核心Java库声明的接口。有人已经为Java 1.7提供了一个很好的答案,有人已经为Java 1.7提供了一个很好的答案,而不是“FileAction”,我可能会使用类似“函数”或“Action”的接口。perform()如果没有参数或函数具有公共O应用(I输入),而不是“FileAction”,我可能会使用类似于“函数”或接口“Action”具有的操作。如果没有参数或函数具有公共O应用(I输入),则执行()