Scala 如何避免破坏引用透明度

Scala 如何避免破坏引用透明度,scala,functional-programming,Scala,Functional Programming,我有以下代码打破了引用透明性: val producerSettings = ProducerSettings(system, new StringSerializer, new StringSerializer) .withBootstrapServers("localhost:9092") val kafkaProducer1 = producerSettings.createKafkaProducer() val kafkaProducer2 = producerSettings.c

我有以下代码打破了引用透明性:

val producerSettings = ProducerSettings(system, new StringSerializer, new StringSerializer)
  .withBootstrapServers("localhost:9092")

val kafkaProducer1 = producerSettings.createKafkaProducer()
val kafkaProducer2 = producerSettings.createKafkaProducer()

println(kafkaProducer1)
println(kafkaProducer2)
输出为:

org.apache.kafka.clients.producer.KafkaProducer@49c7b90e
org.apache.kafka.clients.producer.KafkaProducer@10d307f1  
如您所见,每次调用方法
createKafkaProducer()
,它都会生成一个Kafka Producer的新实例


如何避免它破坏引用透明性?

如果您创建一个完美的函数方法来连接两个字符串,那么您也会得到两个不同的对象,但这实际上不会破坏引用透明性。您确定这会吗?使用串联两个字符串,它不会破坏引用透明度。但是物体呢?我是scala的新手。这是你的答案。这两个字符串将位于不同的地址,并且是不同的“对象”。您在同一事物的两个实例中看到的是同一事物,但是如果
kafkaProducer1
没有任何变异,并且您将其用于某个任务,您可以使用
kafkaProducer2
代替它,并获得相同的结果。我假设KafkaProducer有一个函数接口,因为我对它一无所知,而且你的代码并不意味着你破坏了引用透明性,就像把两个字符串串联两次一样。(不包括
println
)的明显副作用@sylvester当我用相应的值替换表达式
producerSettings.createKafkaProducer()
时,我失败了,因为同一表达式有不同的值。这是否违反了RT?@zero\u编码方法似乎是功能性的,因此在实践中它与
“1+1=${1+1}”
相同。重复两次将得到两个具有相同字符串值的不同字符串。你同意这是功能性的,并且保持了引用的透明性吗?如果你制作了一个完美的功能性方法,将两个字符串连接起来,你也会得到两个不同的对象,但这实际上并没有破坏引用的透明性。您确定这会吗?使用串联两个字符串,它不会破坏引用透明度。但是物体呢?我是scala的新手。这是你的答案。这两个字符串将位于不同的地址,并且是不同的“对象”。您在同一事物的两个实例中看到的是同一事物,但是如果
kafkaProducer1
没有任何变异,并且您将其用于某个任务,您可以使用
kafkaProducer2
代替它,并获得相同的结果。我假设KafkaProducer有一个函数接口,因为我对它一无所知,而且你的代码并不意味着你破坏了引用透明性,就像把两个字符串串联两次一样。(不包括
println
)的明显副作用@sylvester当我用相应的值替换表达式
producerSettings.createKafkaProducer()
时,我失败了,因为同一表达式有不同的值。这是否违反了RT?@zero\u编码方法似乎是功能性的,因此在实践中它与
“1+1=${1+1}”
相同。重复两次将得到两个具有相同字符串值的不同字符串。您同意这是功能性的,并保持引用的透明度吗?