什么是(1)通用实践和(2)在java中以一种方法返回一对对象的可能解决方案?
示例:假设我在模型中有一个CheckersBoard
类,其方法f
采用BoardFieldIndex start, BoardFieldIndex end
描述一个视图所要求的移动并返回一对Figure f
(如果start
被占用)和MovementVector v
(如果它在董事会中是合法的)。
在C ++中,我有两个流行的选项:
(我。)
Figure *f; MovementVector *v;
board.f( start, end, f, v );
(II。)
Figure *f; MovementVector *v;
std::Pair<Figure*, MovementVector*> tuple = board.f( start, end );
f = tuple.first; v = tuple.second;
在Java中,我能想到的唯一解决方案是:
我想知道什么是最佳实践,或者我如何以对Java感觉自然的方式来实现。我个人最喜欢(I.),但这里不可能。我在其他解决方案中遇到的问题是,我以一种不会暗示它们包含的内容的方式访问元组的元素,并且我认为它对文字编程范例有点过分。
答案 0 :(得分:3)
您可以为实现Map.Entry<Figure,MovementVector>
的两个对象定义内部容器,然后使用getKey()
获取图形对象,使用getValue()
来获取MovementVector。例如:
private class MyEntryClass<K,V> implements Map.Entry<K,V> {
private final K key;
private V value;
public MyEntryClass(K key, V value) {
this.key = key;
this.value = value;
}
public K getKey() {
return key;
}
public V getValue() {
return value;
}
public V setValue(V value) {
V old = this.value;
this.value = value;
return old;
}
}
然后(假设f是你的图,v是你的MovementVector)你可以返回new MyEntryClass<Figure,MovementVector>(f,v);
编辑:为了可扩展性/普遍性,使类参数通用
答案 1 :(得分:1)
您只能返回一个 thing ,除非它们存储在一个数组中,否则您可能不会返回多个对象,而是返回实际的数组。
最好将对象简单地存储在List<T>
中,然后在方法中返回List
。从那里你可以直接检索那个数组中你想要的任何元素。
我也意识到你提到了对象的对。如果您希望存储和检索特定结构中的对象,您可以创建(如Max建议的那样)自定义DTO类并简单地返回它。
答案 2 :(得分:1)
Apache的Common-Lang已经defines a Pair
类型,为了您的方便,如果您想使用它。 tuple
子包也是defines a lot of useful containers。
那就是说,我会说这样的情况会要求一个对象将这两个值封装在一起;如果你需要返回它们,那么从长远来看,使用比Pair<Figure, MovementVector>
更有意义的包装可能对你更好。
答案 3 :(得分:1)
我能想到至少有4个基本选项:
返回List<Object>
或Object[]
。
从非核心库返回Pair
或Tuple
类。
公共方法可能不应该这样做,因为getter有无意义的名字。
创建您自己的自定义类型并返回该类型。 这通常是最好的解决方案。
允许其中一个方法参数是可变的。
例如,如果您想返回3 doubles
和String
,则可以创建其中一个方法参数double[] arr
。然后,该方法可以为arr[0]
,arr[1]
和arr[2]
分配值,并返回String
。这有点笨拙但有时很有用。
答案 4 :(得分:0)
如果您要返回两种不同的类型,我绝对不建议使用List
,因为您提到的类型原因。我的建议是创建一个结果/响应类型,例如
Tuple<Figure,Movement>
或重复使用Map.Entry
。
另请阅读this question and answers。
干杯,