我对Java中的参数传递有疑问。假设我有一个方法:
public void x(Object o)
假设我叫x(3)和x(“abc”)。 x(3)将花费更多时间,因为构造了一个新的Integer,因为3不是Object。假设我无法更改方法调用,只有方法实现(和参数类型),有没有办法阻止这个Integer构造,直到方法x中的某个点我知道它真的需要它?
谢谢, TEO
答案 0 :(得分:3)
不,Java没有办法让你以你描述的方式懒惰地评估方法的参数。
Java语言规范的Section 15.12.4确切地解释了方法调用的工作原理以及在调用方法之前如何评估方法的参数。
答案 1 :(得分:2)
您可以创建一个延迟评估的对象,如Callable
public void method(Callable<Object> callable) {
// if you really need it
Object obj = callable.call();
}
你不经常看到这个的原因是它通常更慢更复杂。
顺便说一句:x(3)
不会创建对象,因为它实际上是x(Integer.valueOf(3))
而valueOf
有一个小整数值的缓存。
对于大多数应用程序而言,与创建延迟评估值的复杂性相比,创建一个非常小的简单对象(如Integer)的成本很小。
如果你想避免创建对象,你可以
public void x(Object o) ;
public void x(int i);
或
public void x(long l);
或
public void x(double d);
后面的示例避免创建x
的大量变体。
答案 2 :(得分:0)
1)没有办法推迟创建对象
2)差别很小,你不需要关心
答案 3 :(得分:0)
如果方法x只处理整数而不是任何其他类型的对象,那么你可以将方法更改为
public void x(int x){
//do something and then create the object as needed.
}
但是在你的情况下,该方法将采用任何类型的对象,因此除了创建一个新的整数对象之外别无他法。