如何在一个方法中返回一对对象?

时间:2014-12-16 21:10:28

标签: java tuples

什么是(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中,我能想到的唯一解决方案是:

  1. 使用List作为Tuple的替代。但问题是我没有在那里定义类型并使用原始列表我认为不鼓励。
  2. 实施自定义通用类对。
  3. 我想知道什么是最佳实践,或者我如何以对Java感觉自然的方式来实现。我个人最喜欢(I.),但这里不可能。我在其他解决方案中遇到的问题是,我以一种不会暗示它们包含的内容的方式访问元组的元素,并且我认为它对文字编程范例有点过分。

5 个答案:

答案 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个基本选项:

  1. 返回List<Object>Object[]

  2. 从非核心库返回PairTuple类。 公共方法可能不应该这样做,因为getter有无意义的名字。

  3. 创建您自己的自定义类型并返回该类型。 这通常是最好的解决方案。

  4. 允许其中一个方法参数是可变的。 例如,如果您想返回3 doublesString,则可以创建其中一个方法参数double[] arr。然后,该方法可以为arr[0]arr[1]arr[2]分配值,并返回String。这有点笨拙但有时很有用。

答案 4 :(得分:0)

如果您要返回两种不同的类型,我绝对不建议使用List,因为您提到的类型原因。我的建议是创建一个结果/响应类型,例如

Tuple<Figure,Movement>

或重复使用Map.Entry

另请阅读this question and answers

干杯,