我不是编程新手,但我是Java新手。我有一个应用程序,其函数需要返回从数据库中提取的Integer和Short值,因此我可以调用该函数,然后在其他地方使用这两个值。我已经尝试了一个我知道可以做到这一点的hashmap,但我不想迭代任何东西。它总是会找到一个“记录”,所以一个是Int,一个是Short。
最好的方法是什么?
答案 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;
}
}
但是,这个类确实有益处,只要T1
和T2
是不可变的,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在某些情况下也是好的,特别是如果您通过一系列方法累积数据。传递物体阵列是令人讨厌的,但它会起作用。
当然,如果这对你正在做的事情有意义的话,你也可以传递Map
或Collection
。
对于通用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
的对象,该对象包含您需要的两个(可能是公共的)字段。