我有以下代码。在另一个类中,我尝试创建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())
}
}
1条答案
按热度按时间ovfsdjhp1#
是的,
lazy val
只在第一次使用时初始化一次。这意味着,第一次使用amazonS3Client
时,getS3Client
方法将被调用,随后每次使用amazonS3Client
时,都将使用缓存的值。还有一些提示。您在
readFromS3(obj: S3Object)
方法中混合了Java元素,但没有充分的理由,它可以很容易地重写为纯Scala:关于
readFromS3(s3Bucket: String, filepath: String)
,你不应该在scala中使用null
,如果你正在处理的东西可能有值也可能没有值,请参见Option
,对于可能崩溃并出现错误的东西,请参见scala.util.Either
和scala.util.Try
。在try
块中抛出异常时,此函数的预期行为是什么?在当前设计中,它将重新抛出异常并升级调用堆栈。