10

在 PL/SQL(或许多其他语言)中,我可以拥有从过程返回的 IN OUT 或 OUT 参数。如何在 Java 中实现类似的功能?

我知道这个技巧:

public void method(String in, String[] inOut, String[] inOut2) {
  inOut[0] = in;
}

其中in参数代表IN参数,inOut参数可以保存返回值。约定String[] inOut是一个数组inOut.length == 1

这有点笨拙。

编辑对答案的反馈:其他技巧包括:

  • 持有者/包装类,但我不想介绍任何新类型、回调等。
  • 返回值:我想要一个通用的解决方案。即一个涉及多个 IN OUT 参数。
  • IN OUT 参数的包装器作为返回值:这是一个可行的选择,但仍然不是很好,因为必须以某种方式生成该包装器

有谁知道一般实现这一目标的更好方法?我需要一个通用解决方案的原因是因为我想在数据库模式中从 PL/SQL 生成方便的源代码。

4

3 回答 3

12

我的问题是:为什么不method 返回一些东西?而不是设置输入/输出参数?

但是假设你绝对肯定有一个输入/输出参数,这是一个完全不同的问题,那么数组技巧就可以了。或者,它并不那么笨拙,但另一种方法是传入一个对象引用:

public class Foo {
    private String value;

    public Foo(String v) {
        this.value = v;
    }

    public String getValue() {
        return this.value;
    }

    public void setValue(String v) {
        this.value = v;
    }
 }

 // ....
 public void method(String in, Foo inOut) {
     inOut.setValue(in);
 }

(或者,当然,只是value公开。)看到了吗?我说它并没有那么笨拙。

但我又要问了:不能method退货?如果它需要返回多个东西,它不能返回一个带有这些东西属性的对象实例吗?

题外话:这是我真正喜欢 C# 方法的领域之一。反对输入/输出参数的一个论点是它们在您调用函数的地方不清楚。因此,C# 通过在函数声明和调用函数时都指定关键字,让您清楚地知道。在没有这种句法帮助的情况下,我会避免“模拟”输入/输出参数。

于 2010-12-15T22:42:13.373 回答
4

Java 复制您作为参数传递的任何内容。如果您传递一个原始内部方法,您将拥有该原始方法的副本,并且没有任何修改会影响方法外部的实际变量。如果传递对象,则传递引用的副本,该副本实际上是对原始对象的引用。这是您可以将修改传播到调用该方法的内容的方式 - 通过修改引用“指向”的对象的状态。查看更多信息:Java 是按值传递还是按引用传递?

于 2010-12-15T22:45:59.567 回答
1

没有直接的方法。其他技术包括:

  • 传递一个持有者对象(有点像你的一元数组)
  • 使用例如 AtomicInteger
  • 从业务角度传递一个更有用的对象,该对象恰好是可变的
  • 用于接收结果的自定义接口的回调

如果您考虑一下,数组技巧与在 C/C++ 中传递 T* 没有什么不同

于 2010-12-15T22:42:20.707 回答