Java - 从函数返回混合数据

时间:2012-02-26 19:20:14

标签: java

我不是编程新手,但我是Java新手。我有一个应用程序,其函数需要返回从数据库中提取的Integer和Short值,因此我可以调用该函数,然后在其他地方使用这两个值。我已经尝试了一个我知道可以做到这一点的hashmap,但我不想迭代任何东西。它总是会找到一个“记录”,所以一个是Int,一个是Short。

最好的方法是什么?

6 个答案:

答案 0 :(得分:3)

更通用的解决方案是创建一个Pair<T1, T2>类,类似于ML / OCaml / F#中的元组构造或C#中的Tuple类,但不是很好(尤其是因为一般这个问题的解决方案由于原语的装箱/拆箱而失去性能):

public final class Pair<T1, T2> {
    private final T1 item1;
    private final T2 item2;

    public Pair(T1 item1, T2 item2) {
        this.item1 = item1;
        this.item2 = item2;
    }

    public T1 getItem1() {
        return item1;
    }

    public T2 getItem2() {
        return item2;
    }
}

但是,这个类确实有益处,只要T1T2是不可变的,Pair类型的对象也是不可变的。

答案 1 :(得分:3)

不幸的是,Java并不支持&#34; out&#34;参数因此只有几个选项,而且它们都非常糟糕。

1)有一个struct-ish类用于封装返回类型:

class MixedData {
    public int intValue;
    public short shortValue;
    public MixedData(int intValue, short shortValue) {...}
}

public MixedData foo() {
    return new MixedData(...);
}

2)传入struct-ish(或对象数组,或其他任何东西)作为假的&#34; out&#34;参数

public void foo(MixedData result) {
    result.intValue = ...;
    result.shortValue = ...;
}

2.5)在您的具体情况下,您实际上可能会滥用java.util.concurrent.atomic包并执行此操作:

public void foo(AtomicInteger intValue, AtomicInteger shortValue) {
    intValue.set(...);
    shortValue.set(...);
}

它为您提供了更多类似C的签名,但不要这样做。尤其是因为没有AtomicShort

3)返回一个对象数组并记录每个索引处的对象:

/** 
 * @return intValue, shortValue
 */
public Object[] foo() {
    return new Object[] {intValue, shortValue};
}

一般来说,&#34;首选&#34;选项是第一个,但选项2在某些情况下也是好的,特别是如果您通过一系列方法累积数据。传递物体阵列是令人讨厌的,但它会起作用。

当然,如果这对你正在做的事情有意义的话,你也可以传递MapCollection

对于通用Pair(或Tuple)类是否是个好主意,存在一些宗教战争;如果它对您的目的有意义,那么写一个Pair课程,如果没有,那么坚持使用特定的MixedData课程。

答案 2 :(得分:2)

创建一个包含这两个属性的类,并返回此类的实例。

答案 3 :(得分:2)

定义一个帮助器类,并返回它。

class MyResults {
    public final short a;
    public final int   b;
    public MyResults(short a, int b) { this.a = a; this.b = b; }
}


MyResults myMethod() {
    ...
    return new MyResults(42, 666);
}

答案 4 :(得分:0)

您应该创建一个新对象来执行此操作。您可以随意调用它:ShortIntPair等。可能更具描述性。

public class ShortIntPair {
    public short s;
    public int i;
    public ShortIntPair(int i, short s){
        this.i = i;
        this.s = s;
    }
}

答案 5 :(得分:0)

只需返回类YourRecordType的对象,该对象包含您需要的两个(可能是公共的)字段。