kotlin - kotlin null 安全容器'是一个可变属性,此时可能已更改
问题描述
class ExchangeRatesServiceImpl : ExchangeRatesService {
private var container: ExchangeRatesContainer? = null
/**
* {@inheritDoc}
*/
override val currentRates: Map<Currency, BigDecimal>
get() {
if (container == null || container.date != LocalDate.now()) {
container = client.getRates(Currency.getBase())
log.info("exchange rates has been updated: {}", container)
}
return ImmutableMap.of<Currency, BigDecimal>(
Currency.EUR, container.rates[Currency.EUR.name],
Currency.RUB, container.rates[Currency.RUB.name],
Currency.USD, BigDecimal.ONE
)
}
}
line if (container == null || container.date != LocalDate.now()) 错误【因为 'container' 是一个可变属性,此时本可以更改】</p>
我该如何编译它?
解决方案
container
在函数范围之外声明,因此理论上另一个线程可以在您检查null
然后使用它之间修改它。为了防止这种情况,您应该创建一个初始化为 的局部变量container
,并像这样使用它:
class ExchangeRatesServiceImpl : ExchangeRatesService {
private var container: ExchangeRatesContainer? = null
/**
* {@inheritDoc}
*/
override val currentRates: Map<Currency, BigDecimal>
get() {
val tempContainer = container
if (tempContainer == null || tempContainer.date != LocalDate.now()) {
tempContainer = client.getRates(Currency.getBase())
log.info("exchange rates has been updated: {}", tempContainer)
}
return ImmutableMap.of<Currency, BigDecimal>(
Currency.EUR, container.rates[Currency.EUR.name],
Currency.RUB, container.rates[Currency.RUB.name],
Currency.USD, BigDecimal.ONE
)
}
}
推荐阅读
- r - 如何访问使用输入传递的传单地图?
- azure - 如何在 SPA Nuxt Web 应用程序的客户端访问 Azure 应用程序设置
- java - 在 MongoDB 中更新值加 1
- r-markdown - 在 RMarkdown 中编织时服务器意外关闭连接
- microsoft-graph-api - js Office插件试图获取文本输入字段以将变量传递给图形API调用
- python - 将 4 个十六进制字节转换为 RGBA 颜色
- python - 使用 seaborn 联合图返回 hexbin 中的值数组
- linux - 在 Dante Socks5 Server ubuntu 中允许绑定连接
- python - 无法在 python 中读取地理空间数据(img、rrd、ige 文件)
- python - Python:更改 JSON 中的元素