gpt4 book ai didi

java - 变量赋值操作重复

转载 作者:行者123 更新时间:2023-11-29 04:00:29 25 4
gpt4 key购买 nike

上下文

来自 The Pragmatic Programmer :

Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.

问题

  • 该语句如何与在整个类的多个位置直接设置私有(private)成员变量的值相协调?
  • 值不能有外部依赖性,这重要吗?
  • 在访问器之外的其他地方直接更改具有公共(public)访问器的私有(private)成员变量是否重复?

例子

考虑以下代码:

public class Line {
private boolean changed;
private double length;
private Point start;
private Point end;

public Line( Point p1, Point p2 ) {
this.start = p1;
this.end = p2;
this.changed = true;
}

public void setStart( Point p ) { this.start = p; this.changed = true; }
public void setEnd( Point p ) { this.end = p; this.changed = true; }
public Point getStart() { return this.start; }
public Point getEnd() { return this.end; }

public double getLength() {
if( this.changed ) {
this.length = start.distanceTo( end );
this.changed = false;
}

return this.length;
}
}

即使 changed 变量从未公开(通过公共(public)访问器或其他方式),同一行代码基本上重复了四次:this.changed = true (三次)和 this.changed = false(一次)。同样,this.startthis.end 的赋值发生了多次。相对于:

  public Line( Point p1, Point p2 ) {
setStart( p1 );
setEnd( p2 );
}

public void setStart( Point p ) { this.start = p; dirty(); }
public void setEnd( Point p ) { this.end = p; dirty(); }

public double getLength() {
if( isDirty() ) {
setLength( getStart().distanceTo( getEnd() ) );
clean();
}

return this.length;
}

更新后的代码非常相似,但是删除了所有赋值的重复(假定 dirty()clean() 使用访问器)。 (由于重新使用访问器方法进行赋值,构造函数中对 dirty() 的重复调用以前不存在。)

问题不在于 this.changed = true 是否更容易被理解为 dirty()

澄清

问题是关于 this.variable = value 是否是一个“知识片段”,因此应该有一个被一致使用的“单一、明确、权威的表示”:一个相应的访问器。因此一般情况:

public class C1 {
private Object v;

public C1() {
this.v = new C1();
}

public void m1() {
this.v = new String();
}

public void m2() {
System.out.println( this.v );
}
}

对比:

public class C2 {
private Object v;

public C2() {
setV( new C2() );
}

public void m1() {
setV( new String() );
}

public void m2() {
System.out.println( getV() );
}

private void setV( Object o ) { this.v = o; }
private Object getV() { return this.v; }
}

在C1中,变量v在多处直接赋值。在 C2 中,变量 v 是直接赋值在一个地方。尽管在这两种情况下,v 都是完全私有(private)的,但 C1 实现是否复制了“知识片段”?

最佳答案

How is that statement reconciled with directly setting a private member variable's value throughout a class in multiple places?

只有一个私有(private)成员变量。因此只有一个表示。改变这种表示的语句本身并不是表示。拥有多个访问/更改表示的语句与拥有多个表示不同。

Does it matter as there can be no external dependencies on the value?

没有。

Is it duplication to directly change private member variables that have public accessors in other places besides the accessor?

没有。

但这并不一定意味着这样做是个好主意。

在您的示例中,选择是直接访问和更新“脏”标志,还是通过轻量级私有(private)方法执行此操作。 IMO,这归结为关于哪种方法可以为您提供更具可读性的代码的值(value)判断。我的感觉是这两种方法之间几乎没有区别,至少在这种情况下是这样。在其他情况下,使用内部方法访问/更新永远不会公开的私有(private)状态可能更有说服力。

如果需要在类之外公开状态,则很有必要将变量声明为私有(private)并提供 getter 和 setter 供其他类使用。如果已经声明了这些 getter 和 setter,那么您可以提出一个(较弱的)案例,即类本身应该使用它们。

对于那些关心 Java 中 getter 和 setter 的效率或其他方面的人来说,它很可能不会对性能产生影响。现代 JVM 中的 JIT 编译器几乎肯定会内联方法,如 clean()dirty()isDirty(),导致机器指令是等同于直接获取和设置变量的情况。事实上,最新的 JIT 编译器甚至会在推断出不需要分派(dispatch)这些方法时内联非最终公共(public)方法。

关于java - 变量赋值操作重复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3898862/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com