java - 总是从对象中读取一个值,或者将它存储在一个变量中并使用它是一个好习惯吗?
问题描述
我想知道始终从对象中读取值或将其存储在变量中并使用它是否是一种好习惯(为什么不是好习惯或好习惯)
下面一段代码
private void calc(Product product){
User = new User(product.getCode(), ...) // Line 2
....
....
if(product.getCode() == 2){ //Line 4
.....
}
}
在第 2 行和第 4 行,我从product.getCode()获取代码。那么可以从产品对象中读取它还是将其存储在一个变量中,比如String code = product.getCode()然后在第 2 行和第 4 行使用代码
解决方案
您要问的是制作一个值的本地副本是否是一种好习惯,或者您是否应该始终从拥有该值的某个来源获取该值。
答案是,这取决于。
您必须始终记住的是,当您从某个来源制作值的本地副本时,您拥有该值的副本。你不拥有价值本身,也不拥有创造价值的机制。你只拥有一个副本。该副本是制作副本时生成的值的副本。
所以潜在的问题是,当您复制该值时,您从中获取它的生成机制是否会改变它将在未来某个时间提供的值。如果生成机制更改它生成的值,您的值副本将变为无效。
要回答这个问题意味着您必须 (1) 对生成值的机制如何做到这一点有一定的了解,以及 (2) 生成机制不会在未来某个时间以使您所知道的无效的方式发生变化现在关于机制如何产生价值。
从某些生成机制(例如函数)制作值的本地副本会破坏封装。生成机制以及为生成机制采取的任何封装和更改隔离措施都被绕过,它不再是价值的来源,而是本地副本。
在我看来,唯一应该考虑制作一个值的本地副本是当获取该值的机制足够昂贵时,通常在时间或计算资源方面,它是有意义的本地副本。通常,本地副本的基本原理是由于与使用生成机制相关的计算成本或时间成本。时间成本可能是服务器请求的网络延迟,或者价值需要大量计算才能创建。
然后,制作本地副本要求您确保本地副本正确地隐藏生成机制将提供的值。如果生成机制始终提供相同的值,例如始终为相同输入提供相同输出的函数,则本地副本是可防御的。
如果您有某种方法可以监视提供各种值的生成机制,以便生成机制可以告诉您是否有新值,例如数据库触发器或其他类型的事件,那么您可以在使用之前执行该检查本地副本以确定本地副本是否仍然有效。如果本地副本不再有效,那么您可以使用生成机制获取新副本。
在某些情况下,本地副本阴影生成的实际值的时间跨度落在本地副本的生命周期内。换句话说,本地副本的生命周期比生成值的生命周期短。例如,为了优化循环而对值进行本地缓存可能是合适的。我的意思是,您从生成机制中获取值的副本并将其存储在局部变量中,执行在某种计算中使用该值的循环,然后丢弃本地副本。这可能使循环所花费的时间远少于每次获取值所花费的时间,并且由于循环处理所花费的时间跨度很短,因此生成机制提供的值的任何更改都可以忽略不计并且可以忽略不计。
这方面的一个例子是从传感器中提取温度和湿度,然后仅使用单个值执行一系列计算。这样做的原因是与传感器交互和提取数据的开销是合理的一次,但不是在一个循环内多次。
制作本地副本的另一个原因是生成机制中是否存在某种噪音,使得所提供的值在某个误差范围内会略有不同。因此,由于电路中的电噪声,传感器可能会提供每次读取时略有变化的温度读数,因此您只需读取传感器一次,然后使用其中的单个值进行多次计算或以各种方式处理温度值为了减少来自多个略有不同的温度读数的误差。
推荐阅读
- flutter - 如何在 iOS 模拟器上修复“A RenderFlex 在右侧溢出 1329 像素”
- c++ - 如何使用 C 中的内部 c++ 类类型?
- reverse-proxy - 为 cloudflare 设置自定义规则以阻止针对特定规则的攻击 IP
- regex - Firestore 规则 - 匹配 E.164 电话模式
- javascript - 使用 JSON 和 JQuery 合并和分组表
- python-3.x - AsyncSSH 创建 SFTP 客户端错误 - 太多值无法解压
- java - Sparql 查询获取超时异常
- excel - 在 excel 单元格的渲染/显示值上使用公式
- android - 如何使用改造和.net核心从android上传几张图片?
- angular - 模板解析错误:无法绑定到“任务”,因为它不是“任务列表”的已知属性