始终从对象读取值或将其存储在变量中并使用它是一种好习惯吗?

时间:2019-03-13 00:59:03

标签: java java-8

我想知道总是从对象中读取值或将其存储在变量中并使用它的一种好习惯吗(为什么不是好习惯或好习惯)

下面的代码

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行使用 code >

4 个答案:

答案 0 :(得分:2)

您要问的是对值进行本地复制是一种好习惯还是应该始终从拥有该值的某个来源获取该值。

答案是,这取决于。

您必须始终记住的是,当您从某个来源制作值的本地副本时,您拥有该值的副本。您既不拥有价值本身,也没有拥有创造价值的机制。您只是拥有一个副本。该副本是复制时生成的值的副本。

因此,潜在的问题是,当您复制值时,生成机制是否会通过更改将来某个时候提供的值来获取它。如果生成机制更改了它生成的值,则该值的副本将无效。

要回答此问题,您必须(1)对产生值的机制如何做到这一点有所了解,以及(2)在将来的某个时候,产生机制不会以使无效的方式改变的想法您现在对有关机制如何产生价值的了解。

从某种生成机制(例如函数)中生成值的本地副本将破坏封装。生成机制以及为生成机制所采用的封装和更改隔离措施已被绕开,它不再是值的来源,而是本地副本。

在我看来,唯一值得考虑的是制作值的本地副本的方法是,通常在时间或计算资源方面,获取值的机制足够昂贵,通常是在时间或计算资源方面有本地副本的感觉。通常,本地副本的基本原理是由于与使用生成机制相关的计算成本或时间成本。时间成本可能是服务器请求的网络延迟,或者该值需要大量计算才能创建。

然后,制作本地副本要求您确保本地副本正确遮盖生成机制将提供的值。如果生成机制始终提供相同的值,例如某个函数始终为相同的输入提供相同的输出,则可以使用本地副本。

如果您可以通过某种方式监视提供各种值的生成机制,以便生成机制可以告诉您是否存在新值,例如数据库触发器或其他类型的事件,则可以执行该检查在使用本地副本确定本地副本是否仍然有效之前。如果本地副本不再有效,则可以使用生成机制来获取新副本。

在某些情况下,本地副本遮盖实际生成的值的时间跨度在本地副本的生存期内。换句话说,本地副本的生存期短于所生成值的生存期。例如,为了优化循环,该值的本地高速缓存可能是合适的。我的意思是,您从生成机制中获取值的副本,并将其存储在本地变量中,执行一个在某种计算中使用该值的循环,然后丢弃该本地副本。与每次获取值相比,这可能会使循环所花费的时间要少得多,并且由于循环处理所花费的时间跨度较短,因此生成机制提供的值的任何更改都可以忽略不计,并且可以忽略。 >

一个例子是从传感器获取温度和湿度,然后仅使用单个值执行一系列计算。这样做的原因是,与传感器进行交互并提取数据的开销在一个循环内是合理的,但不是多次。

进行本地复制的另一个原因是,在生成机制中是否存在某种噪声,使得所提供的值在某些误差范围内会略有变化。因此,由于电路中的电子噪声,每次读取时,传感器提供的温度读数都会略有变化,因此您只需读取一次传感器,然后进行多次计算或以各种方式处理温度值,而仅使用单个温度值即可。为了减少由多个略有不同的温度读数引起的误差。

答案 1 :(得分:0)

我想这是同一回事。 java中的String是一个对象,因此,当您调用product.getCode()时,它将仅向您传递该String的引用。但是,当然,这取决于该方法的功能。

顺便说一句,要比较字符串的值,您应该使用:

someString.equals(anotherString)

要比较参考,您应该使用:

someString == anotherString

答案 2 :(得分:0)

我们可以根据以下三个标准来比较这些不同的方法。

  1. 性能:在这种情况下,它们应该相同,除非product.getCode()昂贵。
  2. 清洁度:如果多次调用product.getCode(),则第二种方法会更清洁。
  3. 空间:第二种方法必须使用辅助空间。

答案 3 :(得分:-1)

如果它简单而便宜,那么我将继续从对象中读取它。如果可以使代码更清晰或更易于理解,我会将其分成自己的变量。