我正在尝试做这样的事情:
public void <String,int> getItem
{
return <"Jen",23>;
}
我知道我可以使用自定义类,但是如何在一次函数调用中返回两个结果。
1 - java中是否可以使用上述模板函数,调用者将如何获取它的第1部分和第2部分。
2 - 我可以使用关于动作的关联数组吗?
3 - 我可以使用某种散列图吗?
4 - 有什么其他可能的方式
我尝试了所有三种方式,但是这种或那种语法正在打击我。所以,如果有人能提供明确的例子
答案 0 :(得分:10)
Java函数始终返回单个值,因此您唯一的选择是返回包含多个值的“集合”对象,例如数组或正确的Collection。例如:
public Object[] getItem() { return new Object[] { "Jen", 23 }; }
public Collection<Object> { return Arrays.asList("Jen", 23); }
虽然,Java中的典型模式是返回一个封装您的值的自定义类型,例如:
public class NameAge {
public final String name;
public final int age;
public NameAge(String name, int age) {
this.name = name;
this.age = age;
}
}
// ...
public NameAge getItem() { return new NameAge("Jen", 23); }
或更一般地说:
public class Pair<X, Y> {
public final X x;
public final Y y;
public Pair(X x, Y y) {
this.x = x;
this.y = y;
}
}
// ...
public Pair<String,Integer> getItem() {
return new Pair<String,Integer>("Jen", 23);
}
当然,如果要将这些自定义类型用作哈希键,则会对哈希(相等和哈希码)产生严重影响。
答案 1 :(得分:4)
我喜欢使用泛型!创建自己的类并返回它的实例:
public class Tuple<T,V>
{
public T item1;
public V item2;
public Tuple(T i1, V i2)
{
item1 = i1;
item2 = i2;
}
}
然后你创建你的方法:
public Tuple<String, int> getItem()
{
return new Tuple<String, int>("Jen", 23);
}
答案 2 :(得分:1)
Java不允许多个return语句。我认为最好的做法是创建一个自定义对象。你在这里有什么建议人类,一个la
public class Person {
int Age;
String Name;
}
返回一个对象会使你的行为更加直观。
答案 3 :(得分:1)
你可以返回一个Bundle。
public Bundle getItem(){
Bundle theBundle = new Bundle();
theBundle.putString("name","Jen");
theBundle.putInt("age",23);
return theBundle;
}
答案 4 :(得分:1)
正确的方法是为你的回归集创建一个类:
public class ReturnSet {
private String str;
private int num;
public ReturnSet(String _str, int _num) {
str = _str;
num = _num;
}
//add getters and setters
...
}
然后你的功能看起来像
public ReturnSet getItem() {
...
return new ReturnSet(strValue, intValue);
}
当然,你可以通过让你的函数返回一个Object
的数组来捏造东西,但这将是一个相当糟糕的代码:
public Object[] getItem() {
Object[] result;
//allocate it, get data;
...
result[1] = strValue;
relult[2] = new Integer(intValue);
return result;
}
你甚至可以返回一个包含一个元素的hashmap:
public Map getItem() {
Map result;
//allocate it, say as hashmap, get data;
...
result.put(strValue, new Integer(intValue));
return result;
}
然后在调用者中,地图的键将是第一部分,值将是第二部分。
虽然可能有很多方法可以做到这一点,但第一种方法是正确的做法。
答案 5 :(得分:1)
通常,如果您需要从一个函数返回两个值 - 它是code smell。尝试重构代码,以便每个函数始终只返回一个值。请记住,没有返回值(void)也是代码气味,但不太重要。
答案 6 :(得分:0)
如果一个方法返回一些东西,那么它的返回类型必须是这样的:
public MyCustomObject getItem();
或
public Object[] getItem():
或其他任何可以存储结果的内容。
但Java是一种静态类型的OO语言。自定义课程是要走的路。
答案 7 :(得分:0)
您还可以使用“return”参数以常规方式和其他方式返回一个值:
class C {
Type2 value; // omitted getter and setter for brevity
}
Type1 f1(C returnParameter, String otherParameters...)
{
// function body here
returnParameter.value=returnValue2; // store the second result
return returnValue1; // return the first result
}
// usage
Type1 result1;
Type2 result2;
C helper = new C();
result1=f1(helper, "foo", "bar");
result2=helper.value;
要获得更多结果,请使用多个“辅助”对象或可以容纳多个值的对象。
我自己正在寻找一个最优雅的解决方案(在我的情况下,一个返回类型是一个集合,另一个是整数 - 任何变体都可以)。