【问题标题】:Lazy parameter type in Java?Java中的惰性参数类型?
【发布时间】:2011-06-24 11:26:28
【问题描述】:

我对 Java 中的参数传递有疑问。假设我有一个方法:

public void x(Object o)

假设我调用 x(3) 和 x("abc")。 x(3) 将花费更多时间,因为构造了一个新的 Integer,因为 3 不是 Object。假设我不能更改方法调用,只有方法实现(和参数类型),有没有办法阻止这种 Integer 构造,直到方法 x 中的某个点我知道它确实需要它?

谢谢, 特奥

【问题讨论】:

  • 为什么不像 x(int) 那样重载它?
  • @John 不,不是。自动装箱通过调用Integer.valueOf(3) 方法来工作,它确实会返回一个缓存的Integer 对象。如果使用new,总是会创建一个新对象;这不会得到缓存的对象。
  • @Jesper:是的。我的意思是说值 3 的整数对象被缓存了。
  • @Jesper:我删除了我的评论,因为它不清楚。
  • 我的方法实际上是这样的 void x(Object o1, Object o2, ...) 我有 7 个这样的签名,因为我希望我的方法能够接受 7 个参数。出于性能原因,我没有使用可变数量的参数。所以问题是我无法知道哪一个对象将是 int。

标签: java methods parameters casting


【解决方案1】:

不,Java 没有办法让它以您描述的方式懒惰地评估方法的参数。

Java 语言规范的Section 15.12.4 准确解释了方法调用的工作原理以及方法的参数在调用之前如何评估。

【讨论】:

    【解决方案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 的大量变体。

    【讨论】:

      【解决方案3】:

      1) 没有办法推迟对象的创建

      2) 差别很小,你不需要关心

      【讨论】:

        【解决方案4】:

        如果方法 x 只处理整数而不处理任何其他类型的对象,那么您可以将方法更改为

        public void x(int x){ //do something and then create the object as needed. }

        但在您的情况下,该方法将采用任何类型的对象,因此除了创建一个新的整数对象之外别无他法。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-11-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-02-10
          • 2018-01-08
          相关资源
          最近更新 更多