HTML5技术

狗屎的Java规范 - NewSea

字号+ 作者:H5之家 来源:H5之家 2015-12-03 14:31 我要评论( )

规范 标题真有点侮辱了狗。 最近做Java,C#与Java对比笔记: 其实Java语法弱点就弱点,关键是Java程序员思想太保守,先讲湿猴定律:?url=loP9q4bz-T14pQ0y_sa9nZDDFyAjI_eySEHXtyBuB2mRgybuQLyLiKsc-1Tnkq0Vy0f-OYpaHpFMcN0C9XT3_a 贴内容: 把五只猴子关在一

规范

标题真有点侮辱了狗。

最近做Java,C#与Java对比笔记: 

其实Java语法弱点就弱点,关键是Java程序员思想太保守,先讲湿猴定律: ?url=loP9q4bz-T14pQ0y_sa9nZDDFyAjI_eySEHXtyBuB2mRgybuQLyLiKsc-1Tnkq0Vy0f-OYpaHpFMcN0C9XT3_a

贴内容:

把五只猴子关在一个笼子里,上头有一串香蕉实验人员装了一个自动装置。 一旦侦测到有猴子要去拿香蕉,马上就会有水喷向笼子,而这五只猴子都会一身湿。 首先有只猴子想去拿香蕉,当然,结果就是每只猴子都淋湿了。 之后每只猴子在几次的尝试后,发现莫不如此。 于是猴子们达到一个共识:不要去拿香蕉,以避免被水喷到。 后来实验人员把其中的一只猴子释放,换进去一只新猴子A。 这只猴子A看到香蕉,马上想要去拿。 结果,被其他四只猴子海K了一顿。 因为其他四只猴子认为猴子A会害他们被水淋到,所以制止他去拿香蕉,A尝试了几次,虽被打的满头包,依然没有拿到香蕉。 当然,这五只猴子就没有被水喷到。 后来实验人员再把一只旧猴子释放,换上另外一只新猴子B。 这猴子B看到香蕉,也是迫不及待要去拿。 当然,一如刚才所发生的情形,其他四只猴子海K了B一顿。 特别的是,那只A猴子打的特别用力(这叫老兵欺负新兵,或是媳妇熬成婆^O^)。 B猴子试了几次总是被打的很惨,只好作罢。 后来慢慢的一只一只的,所有的旧猴子都换成新猴子了,大家都不敢去动那香蕉。 但是他们都不知道为什么,只知道去动香蕉会被猴扁。 这就是道德的起源。

写这篇文章,主要是在接触Java之后,有一些感想。但对我震撼最大的莫过于Java程序员的思想束缚。

1. Java很老,很多规范是在N年前就由一帮外国的老学究定下的。现在的猴子一直在遵守,很少有人去打破,他们发现一旦打破,程序就跑不起来了。

2. Java 1.8比 Java 1.6好多了,但我面试的过程中,很多人都在使用 1.6

3. Lambda对Java程序员来说,就像怪物。很多人仅听说过,没有用过。 

4. 在年纪大的Java程序员眼中, 新版本是给小白用的,自己不会主动去用。违了Java规范的东西,都是怪物。

 

一种约定俗成的东西,形成了规范,但是当这个规范被大众接受,再想溶入新东西,就很难了。

Java对象 引出

Java定义对象有N多规范,get , set 方法,private 字段。一旦形成规范,才能让映射,Json变的简历一些,同时也意味着,也变的死板。

Javascript Post Json:

{ Id: 1 , Name:"abc" }

=>C# Json

public class Model{ public int Id { get; set;} public String Name {get;set;} }

=> Java Json

public class Model{ public int Id; public String Name; }

在 SpringMvc 里是映射不到的。很多人会先说,要用 get set。

public class Model { private String Name; public String getName() { return Name; } public void setName(String name) { this.Name = name; } private String Id; public String getId() { return Id; } public void setId(String id) { this.Id = id; } }

还是不行,按照Java规范,需要把客户端Post Json 的Key 首字线变成小写。

规范真是害死人啊。鸡肋的ModelBinder,很多人在这里妥协,要么传递首字母小写,要么传递Json字符串, 万能的字符串。

破解

自己实现序列化。

对枚举进行规范化: 定义的枚举可以和数字相互转换(和C#一致),存储时,枚举保存为 Int,服务器传递到客户端的枚举,客户端传递到服务器端的枚举,都使用 Int。

如果客户端Post的内容格式是  application/json ,还好说。 直接用 Json反序列化到 HasMap<String,Object> 上,再操作。

如果客户端Post的内容格式是  url 格式的, 那就需要自己写转换函数。

接收:

@RequestMapping(method = RequestMethod.POST, value = "/testModel" ) @ResponseBody public String test() { Test test = MyObject.Get(new Test()); String ret = JsonMapper.toJsonString(test); System.out.println(ret); return ret ; }

 

关键是客户端Post的Json数据格式可能会是以下格式:

PersonInfo[0].Id=1&PersonIndo[0].CityInfo.Name=北京

需要把Key变成更精准的层级对象。把Url加载到HashMap中。再进行深层次对象化。

public static <T> T Get( T defValue) { Class cls = defValue.getClass(); HttpServletRequest request = HttpContext.getRequest(); MapModel map = new MapModel(); String result = ""; try { BufferedReader inputStream = new BufferedReader(new InputStreamReader(request.getInputStream())); String line; while ((line = inputStream.readLine()) != null) { result += line; } } catch (Exception e) { e.printStackTrace(); } if (request.getContentType().indexOf("application/json") >= 0) { map.Add(JsonMapper.fromJsonString(result, MapModel.class)); } else { map.Add(MapModel.LoadFromUrl(result)); } map.Add(MapModel.LoadFromUrl(request.getQueryString())); for (Field f : cls.getDeclaredFields()) { Object val = map.get(f.getName()); if (val == null) continue; Class type = f.getType(); if (type.isEnum()) { val = MyEnum.ToEnum(type, MyObject.AsString(val)); } else if (type.isAssignableFrom(Integer.class) || type.isAssignableFrom(int.class)) { val = MyObject.AsInt(val); } else if( HashMap.class.isAssignableFrom(type)){ val = ToMap(val); } else if( IsSimpleType(type) == false){ try { val = FromMap(ToMap(val), f.get(defValue)); } catch (IllegalAccessException e) { e.printStackTrace(); } } try { f.setAccessible(true); f.set(defValue, val); } catch (IllegalAccessException e) { e.printStackTrace(); } } return defValue; }

 

 

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  • Java 8 Lambda 表达式 - Felix_ICanFixIt

    Java 8 Lambda 表达式 - Felix_ICanFixIt

    2017-04-22 17:04

  • Omi v1.0.2发布 - 正式支持传递javascript表达式 - 【当耐特】

    Omi v1.0.2发布 - 正式支持传递javascript表达式 - 【当耐特】

    2017-03-22 11:03

  • JavaWeb与Asp.net工作原理比较分析 - 社会主义接班人

    JavaWeb与Asp.net工作原理比较分析 - 社会主义接班人

    2017-03-12 14:00

  • 一道面试题引发的对javascript类型转换的思考 - ChokCoco

    一道面试题引发的对javascript类型转换的思考 - ChokCoco

    2017-03-06 17:00

网友点评
m