【发布时间】:2015-12-07 23:06:36
【问题描述】:
因为我现在正在重构我的代码,所以我试图首先整理出可能的代码重复。 作为一个可能的副本,我看到了两种基本上读取文件的方法:一种来自 FTP,另一种来自本地文件结构。问题是,他们当然使用不同的类来实现相同的目标。变量 directoryListing 是一个棘手的问题。
readLogs(boolean useFTP){
// directory Listing of course needs to be of a different type here or not being declared at all
File[] directoryListing;
File dir = Settings.getInputfolder();
if(useFTP){
// ftp implementation
client = new FTPClient();
client.connect(Settings.getFtpHost());
client.enterLocalPassiveMode();
client.login(Settings.getFtpLoginname(), Settings.getFtpPassword());
client.setFileType(FTPClient.BINARY_FILE_TYPE);
//directoryListing should be of type FTPFile[] here
directoryListing = client.listFiles(Settings.getInputfolder().toString());
else{
//directoryListing should be of type File[] in this case
directoryListing = dir.listFiles();
}
if (directoryListing == null) {
log.error("Input-folder not found:" + dir.getAbsolutePath());
}
//I want to be able to iterate - here myFolder might be of type File oder FTPFile
for (Object myFolder : directoryListing) {
...
...
}
}
我稍后在代码中使用的唯一方法在 File 和 FTPFile 上具有完全相同的签名:
获取名称()
isFile()
isDirectory()
列表文件()
我已经为那些使用了反射,例如
Method getFolderNameMethod = myFolder.getClass().getMethod("getName");
String name = (String) getFolderNameMethod.invoke(myFolder);
我可以通过什么方式实现 directoryListing 变量的某种动态声明?
非常感谢您提前提供的时间和建议! :D
【问题讨论】:
-
这里可以使用泛型吗?我的意思是创建一个遍历列表并进行处理的类,但它是一个通用类,现在您当然知道当 useFTP 为 true 时,它正在获取 FTPFile 实例的类型,而在其他情况下,它正在获取 File 实例,这可能简化处理。
-
@BilboBaggins 据我所知,在不知道列表类型(FTPFile[] 或 File[])的情况下,您无法遍历列表,因此在获取之前我会失败。不过是个好主意……
-
谢谢 :) 我也在考虑获取目录列表的策略模式,即如果“useFTP”为真,则调用您已实现 FTPFile 相关内容的类的实例,否则调用和为 File 使用另一个实例 :)
-
@BilboBaggins 这样做会为 FTP 和本地 2 种情况产生大量重复代码:/
标签: java class dynamic reflection