如何从Java方法返回多个对象?

2022-08-31 06:30:44

我想从Java方法返回两个对象,并且想知道这样做的好方法是什么?

我能想到的可能方法是:返回a(因为两个对象是相关的)或返回对象的。HashMapArrayListObject

更准确地说,我要返回的两个对象是(a)对象和(b)逗号分隔的相同名称。List

我想从一个方法返回这两个对象,因为我不想循环访问对象列表以获取逗号分隔的名称(我可以在此方法的同一循环中执行此操作)。

不知何故,返回a看起来不是一种非常优雅的方式。HashMap


答案 1

如果要返回两个对象,通常需要返回一个封装这两个对象的对象。

您可以返回对象列表,如下所示:NamedObject

public class NamedObject<T> {
  public final String name;
  public final T object;

  public NamedObject(String name, T object) {
    this.name = name;
    this.object = object;
  }
}

然后,您可以轻松返回.List<NamedObject<WhateverTypeYouWant>>

另外:为什么要返回逗号分隔的名称列表,而不是?或者更好的是,返回 a,其中键是对象的名称和值(除非您的对象指定了顺序,在这种情况下,a 可能是您想要的。List<String>Map<String,TheObjectType>NavigableMap


答案 2

如果您知道要返回两个对象,也可以使用泛型对:

public class Pair<A,B> {
    public final A a;
    public final B b;

    public Pair(A a, B b) {
        this.a = a;
        this.b = b;
    }
};

编辑更全面地实现上述内容:

package util;

public class Pair<A,B> {

    public static <P, Q> Pair<P, Q> makePair(P p, Q q) {
        return new Pair<P, Q>(p, q);
    }

    public final A a;
    public final B b;

    public Pair(A a, B b) {
        this.a = a;
        this.b = b;
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((a == null) ? 0 : a.hashCode());
        result = prime * result + ((b == null) ? 0 : b.hashCode());
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        @SuppressWarnings("rawtypes")
        Pair other = (Pair) obj;
        if (a == null) {
            if (other.a != null) {
                return false;
            }
        } else if (!a.equals(other.a)) {
            return false;
        }
        if (b == null) {
            if (other.b != null) {
                return false;
            }
        } else if (!b.equals(other.b)) {
            return false;
        }
        return true;
    }

    public boolean isInstance(Class<?> classA, Class<?> classB) {
        return classA.isInstance(a) && classB.isInstance(b);
    }

    @SuppressWarnings("unchecked")
    public static <P, Q> Pair<P, Q> cast(Pair<?, ?> pair, Class<P> pClass, Class<Q> qClass) {

        if (pair.isInstance(pClass, qClass)) {
            return (Pair<P, Q>) pair;
        }

        throw new ClassCastException();

    }

}

注意,主要是关于Java和泛型的生锈:

  • 两者都是不可变的。ab
  • makePair静态方法可以帮助您进行样板键入,Java 7中的菱形运算符将使它不那么烦人。有一些工作可以使这个非常好的re:泛型,但现在应该没问题了。(c.f. PECS)
  • hashcode并由日食生成。equals
  • 该方法中的编译时强制转换是可以的,但似乎不太正确。cast
  • 我不确定中的通配符是否必要。isInstance
  • 我只是写这篇文章是为了回应评论,仅用于说明目的。