Java方法返回多种类型
程序员文章站
2022-03-02 08:34:53
...
我的文章都整理添加到了个人博客中,大家可以添加这个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.更多的内容请看我的 个人博客(测试版)
下一篇: Git checkout指定tag的代码