java中的可变4维元组

时间:2014-06-20 22:13:09

标签: java tuples mutable

是否存在可变4维元组的Java实现?

MutableTuple4<Intger, Integer, Double, Double> a;
a.setFirst(a.getFirst() + 1);

2 个答案:

答案 0 :(得分:2)

没有内置的通用Tuple4类,但是你可以轻松编写自己的通用任意长度的Tuple类,并且有许多实现可用于基本代码,例如{ {3}}(apache.commons.MutableTriple)。

还有source code here库提供了最多10个元素的不可变元组,您可以根据这些元素进行实现(虽然我没有亲自使用它)。也许你可以问问自己,你是否需要可变性?

事实上,正如其他人已经提到的那样,我强烈质疑具有任意值类型的可变对象的有效性 - 通常更好地将特定概念封装在一个类中而不仅仅是传递#34 ;价值观袋&#34;。

除了注意事项之外,这是一个示例实现,基于上面提到的可以构建的apache MutableTriple类。与往常一样,您需要在多线程环境中使用可变变量时要非常谨慎:不要以任何方式考虑此代码线程安全(我通常更喜欢不可变性而不是可变性)。

public class MutableTuple4<A, B, C, D> { 

    private static final long serialVersionUID = 1L;

    public A first; 
    public B second; 
    public C third; 
    public D fourth; 

    public MutableTuple4(A a, B b, C c, D d) { 
        this.first = a; 
        this.second = b; 
        this.third = c;
        this.fourth = d;
    } 

    public A getFirst() {
        return this.first;
    }

    public void setFirst(A first) {
        this.first = first;
    }

    // remaining getters and setters here...
    // etc...

    @Override
    public int hashCode() {
        int hash = 3;
        hash = 23 * hash + Objects.hashCode(this.first);
        hash = 23 * hash + Objects.hashCode(this.second);
        hash = 23 * hash + Objects.hashCode(this.third);
        hash = 23 * hash + Objects.hashCode(this.fourth);
        return hash;
    }

    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final Tuple<A, B, C, D> other = (Tuple<A, B, C, D>) obj;
        if (!Objects.equals(this.first, other.first)) {
            return false;
        }
        if (!Objects.equals(this.second, other.second)) {
            return false;
        }
        if (!Objects.equals(this.third, other.third)) {
            return false;
        }
        if (!Objects.equals(this.fourth, other.fourth)) {
            return false;
        }
        return true;    
    } 

}

答案 1 :(得分:1)

有,但它专门用于矢量数学,特别是Java3D:

http://docs.oracle.com/cd/E17802_01/j2se/javase/technologies/desktop/java3d/forDevelopers/j3dapi/javax/vecmath/Tuple4d.html

不适用于一般用途的tupling。并且它不允许您像示例节目那样混合整数和双精度。

就像JB Nizet在评论中所说,课程通常更合适。