scala 这个示例在我的示例中只创建了一次吗?

fquxozlt  于 2023-01-13  发布在  Scala
关注(0)|答案(1)|浏览(144)

我有以下代码。在另一个类中,我尝试创建S3ClientClass2对象作为val s3 = new S3ClientClass2()。创建s3之后,然后为每个请求调用readFromS3方法。在这个场景中,我想知道amazonS3Client是只创建一次还是为每个请求创建多次。我认为它只创建一次。对吗?

class S3ClientClass2 {
  lazy val amazonS3Client = this.getS3Client()

  private def getS3Client() = {
    AmazonS3ClientBuilder
      .standard()
      .withRegion(Regions.AP_NORTHEAST_1)
      .build()
  }

  def readFromS3(s3Bucket: String, filepath: String): String = {
    var s3object: S3Object = null
    try {
      s3object = amazonS3Client.getObject(s3Bucket, filepath)
      readFromS3(s3object)
    }
    finally {
      if (s3object != null) {
        s3object.close()
      }
    }
  }

  def readFromS3(obj: S3Object): String = {
    val reader = new BufferedReader(new InputStreamReader(obj.getObjectContent))
    reader.lines().collect(Collectors.joining())
  }
}
ovfsdjhp

ovfsdjhp1#

是的,lazy val只在第一次使用时初始化一次。这意味着,第一次使用amazonS3Client时,getS3Client方法将被调用,随后每次使用amazonS3Client时,都将使用缓存的值。
还有一些提示。您在readFromS3(obj: S3Object)方法中混合了Java元素,但没有充分的理由,它可以很容易地重写为纯Scala:

def readFromS3(obj: S3Object): String = {
    scala.io.Source.fromInputStream(obj.getObjectContent).mkString
  }

关于readFromS3(s3Bucket: String, filepath: String),你不应该在scala中使用null,如果你正在处理的东西可能有值也可能没有值,请参见Option,对于可能崩溃并出现错误的东西,请参见scala.util.Eitherscala.util.Try。在try块中抛出异常时,此函数的预期行为是什么?在当前设计中,它将重新抛出异常并升级调用堆栈。

相关问题