什么是元祖类
java中的办法只能返回单个对象,如果须要返回多个怎么办?通常咱们会创立一个额定的对象,或者把返回内容放入汇合中返回,另外,咱们也有其余的抉择:联合泛型,咱们能够把一组对象间接打包存储于繁多对象中,之后从该对象中读取元素,并能明确晓得各元素的类型,平安的应用它们。
这个概念称为元组,也称为 数据传输对象(即DTO) 或 信使 。
通常,元组能够具备任意长度,元组中的对象能够是不同类型的。不过,咱们心愿可能为每个对象指明类型,并且从元组中读取进去时,可能失去正确的类型。要解决不同长度的问题,咱们须要创立多个不同的元组。上面是一个能够存储两个对象的元组:
public class Tuple2<A, B> { public final A a1; public final B a2; public Tuple2(A a, B b) { a1 = a; a2 = b; }}
public和final的联合保障了元素的可读性和不可修改性。元祖对象的类型组成依赖于传递参数的程序。
咱们能够利用继承来实现更长的元祖:
public class Tuple3<A, B, C> extends Tuple2<A, B> { public final C a3; public Tuple3(A a, B b, C c) { super(a, b); a3 = c; }}public class Tuple4<A, B, C, D> extends Tuple3<A, B, C> { public final D a4; public Tuple4(A a, B b, C c, D d) { super(a, b, c); a4 = d; }}
应用元组时,你只须要定义一个长度适宜的元组,将其作为返回值即可。留神上面例子中办法的返回类型:
public class TupleTest { static Tuple2<String, Integer> f() { // 47 主动装箱为 Integer return new Tuple2<>("hi", 47); } static Tuple3<Student, String, Integer> g() { return new Tuple3<>(new Student(), "hi", 47); }}
应用类型参数推断 ,咱们能够创立若干重载的动态泛型办法来略去new操作的繁琐性:
public class Tuple { public static <A, B> Tuple2<A, B> tuple(A a, B b) { return new Tuple2<>(a, b); } public static <A, B, C> Tuple3<A, B, C> tuple(A a, B b, C c) { return new Tuple3<>(a, b, c); }}public class TupleTest { static Tuple2<String, Integer> f() { return tuple("hi", 47); } static Tuple3<Student, String, Integer> g() { return tuple(new Student(), "hi", 47); }}