sle*_*ske 20 java eclipse compiler-warnings
Eclipse有一个选项可以警告赋值给方法的参数(在方法内),如:
public void doFoo(int a){
if (a<0){
a=0; // this will generate a warning
}
// do stuff
}
Run Code Online (Sandbox Code Playgroud)
通常我尝试激活(并注意)几乎所有可用的编译器警告,但在这种情况下,我不确定它是否值得.
我看到了改变方法中参数的合法情况(例如:允许参数"取消设置"(例如null)并自动替换默认值),但很少会导致问题,除非它可能有点混淆在方法中间重新分配参数.
你使用这样的警告吗?为什么/为什么不呢?
注意:
避免这种警告当然等同于制作方法参数final(只有这是编译器错误:-)).那么这个问题为什么我要在Java中的方法参数上使用关键字"final"?可能是相关的.
Mne*_*nth 13
令人困惑的部分是警告的原因.如果你在方法中重新分配参数一个新值(可能是有条件的),那么它就不清楚了,是什么.这就是为什么它被认为是好的风格,让方法 - 参数保持不变.
T.J*_*der 10
对我来说,只要你早点清楚地做到这一点,就没事了.正如你所说的那样,将其深入四个条件中间深入到30行函数中并不理想.
使用对象引用时,你显然必须要小心,因为调用你给出的对象上的方法可能会改变它的状态并将信息传递回调用者,但当然如果你已经在你自己的占位符中填充了那个信息没有沟通.
另一面是,声明新的变量并赋予该参数(如果需要的参数默认默认),它可能是更清晰,而且几乎肯定不会低效率 - 任何像样的编译器(无论是主编译器或JIT )在可行时将优化出来.
如果参数是引用类型,则重新分配给方法参数变量通常是错误的.
请考虑以下代码:
MyObject myObject = new myObject();
myObject.Foo = "foo";
doFoo(myObject);
// what's the value of myObject.Foo here?
public void doFoo(MyObject myFoo){
myFoo = new MyObject("Bar");
}
Run Code Online (Sandbox Code Playgroud)
许多人都希望在调用doFoo之后,myObject.Foo将等于"Bar".当然,它不会 - 因为Java不是通过引用传递,而是通过引用值传递 - 也就是说,引用的副本被传递给方法.重新分配到该副本只会在本地范围内产生影响,而不会在呼叫站点产生影响.这是最常被误解的概念之一.