首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

Java步骤返回多种类型

2013-03-22 
Java方法返回多种类型我的文章都整理添加到了个人博客中,大家可以添加这个RSS以便获得即时的文章信息。?说

Java方法返回多种类型

我的文章都整理添加到了个人博客中,大家可以添加这个RSS以便获得即时的文章信息。

?

说明:

1.本文讲述3种方式 如有更好方式 欢迎讨论

2.本例前准备:下载jar包:

    http://sourceforge.net/ 下搜索下载json-lib、ezmorphhttp://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){//方式一:使用jsonJSONObject 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.更多的内容请看我的 ?个人博客(测试版)

25 楼 snkcxy 1 小时前   MrCrapBag 写道snkcxy 写道jjcang 写道做个返回对象,或者数组就可以了。

嗯 其实元组的方式就是返回对象,只不过类型不是定死的
嗯 数组倒是一种方式 Object[]

java有元组的概念吗?楼主所谓的元组,其实就是对象嵌套对象的做法吧。

顺便说一下,Object[]数组这种方式很不好哦,因为你拿到返回值之后,会做向下造型,这个时候你就要知道原来的类型是什么了,那你还得缓存每个对象的类型,而且在转换的时候,也是不安全的。
对 这位朋友说的很对
java中没有明确的元组概念 这个就算是模拟吧
Object[]方式肯定不好,这里只是说可以这样做(响应一下那个位朋友的讨论),但是真实情况下肯定不会去用Object去做这些事情。方式繁琐且不安全 26 楼 snkcxy 1 小时前   MrCrapBag 写道
反射得到某个class对象后,比如说classFoo,那么classFoo.getName()就能获取一个类的唯一标识了。

当然,在osgi动态加载的时候,还要和对应加载类的classloader一起才能唯一确定一个类
呵呵 他说的这个是我的另一篇文章http://snkcxy.iteye.com/admin/blogs/1827913
反射获得对象类型 这个我写的很清楚了
其实我们讨论的是如何获取变量的基本类型问题
1.很多朋友看成是 判断是不是基本类型,但是我的文章是讨论获取是什么 而不是是不是~
2.有些人认为我写的多态方式没有实用价值 这个我也解释了 在普通运行的时候确实没有实用价值,因为基本类型 不存在不确定性,但是在动态加载运行类的时候 这个就稍具意义了

热点排行