我的文章都整理添加到了个人博客中,大家可以添加这个RSS以便获得即时的文章信息。
说明:
1.本文讲述3种方式 如有更好方式 欢迎讨论
2.本例前准备:下载jar包:
- http://sourceforge.net/ 下搜索下载json-lib、ezmorph
- http://commons.apache.org/ 下搜索下载以下jar
lang(注意 不要使用最新的3.1 用2.6)、collections、beanutils
3.三种方式简要说明
- Json方式(目前web开发常用的方式)
- 集合方式(最容易想到)
- 泛型元组(最简单最实用)
4.具体内容看注释 写的很清楚,如有疑问欢迎讨论
1.测试类
package com.cxyapi.generics;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import net.sf.json.JSONObject;
/** Java方法返回多种类型
* @author cxy @ www.cxyapi.com
*/
public class ReturnMultipleResult
{
public static void main(String[] args)
{
//方式一:使用json
JSONObject result1=ReturnMultipleResult.way1();
System.out.println(result1);
JSONObject jos=(JSONObject)result1.get("s");
System.out.println(jos.get("name"));
/* JSONObject中存放的都是Object类型(其实是JSONObject类型)
* 如果想使用原来的类型,还需要其他的转换方式(toBean方法)
* 但是toBean方法 对于 有自定义构造函数的class,还需要一个init方法或定义映射
* 好麻烦呀~
* 并且这种方式还需要导入各种jar包
* 但是这种方式并不是一无是处,在action/controller层面还是很好用的,不适合纯业务处理的bo层。
*/
System.out.println("========================");
//方式二:集合
Map<String,Object> result2=ReturnMultipleResult.way2();
System.out.println(result2);
for(Entry<String, Object> one: result2.entrySet())
{
if(one.getKey().equals("s"))
{
Student s=(Student)one.getValue();
s.show();
}else if(one.getKey().equals("t"))
{
Teacher t=(Teacher)one.getValue();
t.show();
}
}
/* 这种方式采用Object超级父类来擦出类型差异
* 但是这种方式处理起来比较复杂,你需要自己判断到底是哪种类型的,并做相应的类型转化
*/
System.out.println("========================");
//方式三:使用泛型元组
TwoTuple<Student, Teacher> result3=ReturnMultipleResult.way3();
result3.first.show();
result3.second.show();
System.out.println(new TwoTuple<String,Integer>("cxy",1));
//应该不用多说了吧~ 优势太明显了,不用判断,不用转型,不用导入jar包,随意更换类型
}
//方式一:使用json返回多个结果对象
public static JSONObject way1()
{
Student s=new Student("小明","清华大学");
Teacher t=new Teacher("cxyapi", "Java编程");
JSONObject backObject=new JSONObject();
backObject.put("s", s);
backObject.put("t", t);
return backObject;
}
//方式二:集合方式
public static Map<String,Object> way2()
{
Student s=new Student("小明","清华大学");
Teacher t=new Teacher("cxyapi", "Java编程");
Map<String,Object> backObject=new HashMap<String, Object>();
backObject.put("s", s);
backObject.put("t", t);
return backObject;
}
//方式二:泛型元组
public static TwoTuple<Student, Teacher> way3()
{
Student s=new Student("小明","清华大学");
Teacher t=new Teacher("cxyapi", "Java编程");
return new TwoTuple<Student, Teacher>(s,t);
}
}
元组:
package com.cxyapi.generics;
/** 元组 可以让一个方法返回多个对象
* @author cxy @ www.cxyapi.com
*/
public class TwoTuple<A,B>
{
/* 定义成final 是为了保证其安全性,不能进行修改
* public final 比private+getter/setter更符合当前的需求
*/
public final A first;
public final B second;
public TwoTuple(A a,B b)
{
first=a;
second=b;
}
public static TwoTuple<String,Integer> tupleTest()
{
return new TwoTuple<String,Integer>("cxy",1);
}
public static void main(String[] args)
{
System.out.println(TwoTuple.tupleTest().first);
System.out.println(TwoTuple.tupleTest().second);
}
}
涉及到的Student类和Teacher类
package com.cxyapi.generics;
/**
* @author cxy @ www.cxyapi.com
*/
public class Teacher
{
private String name; // 姓名
private String course; // 课程
public Teacher(String name, String course)
{
this.name = name;
this.course = course;
}
public void show()
{
System.out.println("我叫:"+this.name+",是一名"+this.course+"教师");
}
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
public String getCourse()
{
return course;
}
public void setCourse(String course)
{
this.course = course;
}
}
package com.cxyapi.generics;
/**
* @author cxy @ www.cxyapi.com
*/
public class Student
{
private String name; //姓名
private String school; //就读学校
public Student(String name, String school)
{
this.name = name;
this.school=school;
}
public Student init()
{
return new Student("1", "2");
}
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
public String getSchool()
{
return school;
}
public void setSchool(String school)
{
this.school = school;
}
public void show()
{
System.out.println("我叫:"+this.name+",就读于"+this.school);
}
}
声明:
1.原创文章,转载请标明并加本文连接。
2.文章反映个人愚见,如有异议欢迎讨论指正
3.更多的内容请看我的 个人博客(测试版)