【发布时间】:2020-04-20 05:49:30
【问题描述】:
我正在尝试解决以下问题。 问题
- 我必须写一个
copy method才能从一个文件系统复制到另一个文件系统。 (即本地到 hdfs,s3 到 s3,以及稍后更多)。 - 此文件系统(本地、s3、hdfs)将来可能会增加,操作(复制、移动、删除)也会增加
- 有些操作是跨文件系统的(即复制、移动)有些不是跨文件系统(删除、列表、查找)
- 我有一个属性文件,其中包含源位置和目标位置,以及一些其他字段(即计数),可帮助我了解将文件复制到何处。
我尝试通过以下方式使用 Factory 解决问题,但仍然无法解决跨平台操作问题。而且代码看起来并不优雅。
实施
abstract class FileSystem(propFileURI: String) {
def moveFile(): Unit
}
object FileSystem {
private class HDFSystem(propFileURI: String) extends FileSystem(propFileURI) {
override def moveFile(): Unit = {
println(" HDFS move file")
}
}
private class S3System(propFileURI: String) extends FileSystem(propFileURI) {
override def moveFile(): Unit = {
println("S3 Move File ")
}
}
def apply(propFileURI: String): Option[FileSystem] = {
val properties: Properties = new Properties()
val source = Source.fromFile( System.getProperty("user.dir")+"\\src\\main\\resources\\"+propFileURI).reader
properties.load(source)
val srcPath = properties.getProperty("srcPath")
val destPath = properties.getProperty("destPath")
if (destPath.contains("hdfs")){
Some(new HDFSystem(propFileURI))
}
if (srcPath.contains("s3") && destPath.contains("s3")){
Some(new S3System(propFileURI))
}else{
None
}
}
def main(args: Array[String]): Unit = {
val obj = FileSystem("test.properties")
obj match {
case Some(test) => test.moveFile()
case None => println("None returned")
}
}
}
问题:
moveFile的当前实现仅处理s3->s3和hdfs->hdfs。如何为local->hdfs和local->s3实现相同的方法如何将
HDFSystem和S3System移动到单独的文件中?如何在
apply方法中避免if/else?
【问题讨论】:
-
您能详细说明您的第一点吗? “实际上并未提及源位置”是什么意思?另外,为什么需要将实现移动到单独的文件中?
-
请查看类似的解决方案。也许它可以提供帮助:github.com/apache/carbondata/blob/master/core/src/main/java/org/…。请查看方法定义:getFileTypeWithActualPath、接口 FileTypeInterface 和 FileTypeInterface 的实现(例如:DefaultFileTypeProvider)。
-
@YuvalItzchakov
moveFile当前支持源和目标的相同文件系统。我也想要跨平台moveFile。HDFSystem和S3System的实现将在一段时间内增长,因此拥有单独的文件不是一个好主意吗?在 Java 中,我可以通过接口和类轻松实现这一点。 -
您可以在 Scala 中创建具有与 Java 相同语义的接口(特征)或抽象类(如您所做的那样),这意味着在抽象类定义之外定义实现。
标签: scala design-patterns scalability