Java语言公约;能手/二传手
在访问自己类中的变量时,优先选择什么; “e.number”或“e.getNumber()” 编辑:Java语言公约;能手/二传手,java,performance,program-flow,Java,Performance,Program Flow,在访问自己类中的变量时,优先选择什么; “e.number”或“e.getNumber()” 编辑: 我认为最重要的问题是:编译器是否知道您调用的方法是getter或setter。因此,将e.setNumber(5)与e.number=5一样快e.getNumber()是常用的方法。所以get或set+VariableName 您也可以看看。号码 Exception number是基类的私有成员。然后我使用getter/setter来说明,它不是扩展类的成员 编辑:哦,你在类内的主函数中使用它吗
我认为最重要的问题是:编译器是否知道您调用的方法是getter或setter。因此,将
e.setNumber(5)代码>与e.number=5一样快代码>e.getNumber()
是常用的方法。所以get
或set
+VariableName
您也可以看看。号码
Exception number是基类的私有成员。然后我使用getter/setter来说明,它不是扩展类的成员
编辑:哦,你在类内的主函数中使用它吗?然后,正如另一个人所说的那样
Public class Example {
private int number;
public Example(int number){
this.number = number;
}
public int getNumber(){
return number;
}
public void setNumber(int number){
this.number = number;
}
public static void main(String[] args){
Example e = new Example(5);
在大多数情况下,它们将被优化为相同的代码,但使用setter/getter的目的是避免在实现发生变化时更改API。然而,在类中您不使用“API”,但您可以看到所有的内部和状态
此外,您还可以使用
this.number
而不是
numer += 5;
编辑:当然,在课堂之外,它应该受到getter/setter的保护,因为您可能会更改内部表示,并且您可以通过在新的状态表示中重新实现它们来提供向后兼容性
编辑2:main
有点特别。我想说的是,main
应该尽可能地最小化-创建一些对象并最多调用一个或两个方法-因此它不应该分配variebles,应该被视为“外部”部分。另一方面,有些测试方法在main
中提供,可能需要直接访问状态。因此,如果可以,您不应该直接访问main
中的字段
至于main
中的速度,这并不重要,因为启动JVM将抵消任何成本。真正的区别在于JIT处理它的内部循环。如果在同一个类中使用它,则为数字。和e.getnumber在任何子类中或在任何外部的任何地方,我认为这取决于具体情况。如果字段很简单,例如int
和将来不太可能更改,我将使用number
而不是getNumber()
访问它
如果该字段表示在某些情况下可能在将来的情况下被计算或可能在子类中被重写的更复杂的内容,getNumber()
是明显的选择
我的经验法则:如果通过getNumber()
我很有可能从中获益,我会使用getNumber()
,否则我会使用number
以清晰和简洁。如果公共访问器是为了其他目的而存在,最好使用此访问器,因为您将确保对变量的一致访问
但是,如果您的变量没有公共访问器,则可以直接访问该变量。我倾向于将其限制为私有变量(即,代码中没有私有访问器,但如果在基类的实现中需要访问,则使用受保护的访问器而不是受保护的成员)
总而言之:我总是将成员保持私有,并通过访问器访问它们,除非所需的唯一访问器是私有的。只有当getter/setter做了额外的事情时才会有区别。如果您从一开始就知道会出现这种情况,那么即使在类中也要使用这些方法。如果没有,我就直接使用字段操作,并在必要时依靠Eclipse帮助我以后进行重构。我通常更喜欢使用setter/getter,即使在内部访问类时也是如此
我这样做是因为有时我希望修改getter,使其不仅仅是检索属性(例如,lazy load变量),而且我希望能够灵活地做到这一点,而不必担心修改类的其他部分
也就是说,也有例外,尽管这些例外在很大程度上是个人偏好,而不是一般的最佳实践。我将直接访问成员变量:
在执行我所认为的“低级”功能时(这是完全主观的),在我的例子中,我考虑了“代码>第二等式())/>代码>代码> > HASCODE()/<代码>,<代码> > ToStrug()/<代码>等“低级”。我不认为这是一个很强的技术原因,它只是“感觉”更好
如果使用setter/getter太不方便(例如,num++
vssetNumber(getNumber()+1
),就像其他人指出的那样)
如果我的getter确实做了一些额外的工作,在我的特殊情况下,我不希望出现这种行为
…我可能还错过了其他一些案例
用这个告别多线程。数字=。。更不用说最终需要实现对这个.number中可能包含的内容的控制。Java总结说,使用setNumber()这个方法可能是最终的,并且可以进行大量优化,因此您无法感觉到差异…getter/setter很好,因为它们通常可以做的不仅仅是充当私有字段的接口。返回/设置的值可能是幕后进行的更复杂计算的一部分
然而,危险在于,因为它们是完全成熟的方法调用,它们可以做任何事情——启动进程、下载文件、执行昂贵的任务等等。从getter/setter的上下文来看,这当然是愚蠢的,但必须避免这样做。我还听说过一些代码,它们执行getter/setter中的大部分功能,但没有真正的方法 要回答最后一个问题,请看这个例子
Java代码:
setNumber(getNumber() + 5);
字节码:
public void test2() {
setNumber(getNumber() + 1);
}
如您所见,字节码仍然进行2个方法调用。所以编译器对它没有任何不同的处理
public test2()V
L0
LINENUMBER 47 L0
ALOAD 0
ALOAD 0
INVOKEVIRTUAL com/test/ByteCodeTester.getNumber()I
ICONST_1
IADD
INVOKEVIRTUAL com/test/ByteCodeTester.setNumber(I)V
L1
LINENUMBER 48 L1
RETURN
L2
LOCALVARIABLE this Lcom/test/ByteCodeTester; L0 L2 0
MAXSTACK = 3
MAXLOCALS = 1