java中创建自己的Tuple


       起因:在写java的时候,经常遇到函数需要返回2个值或者3个值,java必须编写一个Object,来封装,但很多应用场景只是临时使用,构建对象感觉杀鸡用宰牛刀,而其他语言有比较好的实现方法。(当然通过指针引用可以解决一部分问题) 


如:一般写法:    
public class Tt {
    
    
    
public static void main(String[] args) {
        Tt t 
= new Tt();
        User user 
= t.getUser();
        
        
long id = user.getId();
        String name 
= user.getName();
        
        
// TODO .. do something
        
        
    }

    
    
public User getUser() {
        
// 测试
        User user = new User();
        user.setId(
1L);
        user.setName(
"hello");
        
return user;
    }

    
    
class User {
        
private long id;
        
private String name;
        
        
        
        
public long getId() {
            
return id;
        }

        
public void setId(long id) {
            
this.id = id;
        }

        
public String getName() {
            
return name;
        }

        
public void setName(String name) {
            
this.name = name;
        }

    }

    
}
    
                   

   使用Tuple来实现:
   


public class Tt {
    
public static void main(String[] args) {
        Tt  t 
= new Tt();
        Tuple2
<Long, String>  user =  t.getUser();
        
        
long id = user._1();
        String name 
= user._2();
        
        
// TODO ..do something
        
        
    }


    
private  Tuple2<Long, String> getUser() {
        
long id = 1L;
        String name 
= "hello";
        
return Tuple.tuple(id, name);
    }

}


Tuple类:
import java.io.Serializable;

public abstract class Tuple implements Serializable {

    
/**
     * gen by eclipse
     
*/

    
private static final long serialVersionUID = -8719929625763890308L;

    
public static <A, B> Tuple2<A, B> tuple(A a, B b) {
        
return new Tuple2<A, B>(a, b);
    }


    
public static <A, B, C, D, E> Tuple3<A, B, C> tuple(A a, B b, C c) {
        
return new Tuple3<A, B, C>(a, b, c);
    }


    
public static final class Tuple2<A, B> extends Tuple implements Serializable {

        
/**
         * gen by eclipse
         
*/

        
private static final long serialVersionUID = 7263645006696591635L;
        
private A a;
        
private B b;

        
private Tuple2(A a, B b) {
            
this.a = a;
            
this.b = b;
        }


        
public A _1() {
            
return this.a;
        }


        
public B _2() {
            
return this.b;
        }

    }


    
public static final class Tuple3<A, B, C> extends Tuple implements Serializable {

        
/**
         * gen by eclipse
         
*/

        
private static final long serialVersionUID = 482545776907024160L;

        
private A a;
        
private B b;
        
private C c;

        
private Tuple3(A a, B b, C c) {
            
this.a = a;
            
this.b = b;
            this.c = c;
        }


        
public A _1() {
            
return this.a;
        }


        
public B _2() {
            
return this.b;
        }


        
public C _3() {
            
return this.c;
        }

    }

}

note:
          1、这里只是写了2,3,如果有需要直接扩展实现就可以了
          2、这里的Tuple类其实没多大用处,都可以直接使用Tuple2, Tuple3,但为了方便统一从Tuple入口出去,创建了静态方法。这样写更具扩展性。

  Tuple:
          用来表示一组单独的数据,比如数据库中的一条记录;这一点很好理解哈,Tuple的每个Item就像一条记录的每个字段。 
          当我们希望函数返回多个值的时