规范

标题真有点侮辱了狗。

最近做Java,C#与Java对比笔记: http://www.cnblogs.com/newsea/p/4839540.html

其实Java语法弱点就弱点,关键是Java程序员思想太保守,先讲湿猴定律: http://baike.baidu.com/link?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对象序列化

1. 字段大小写

引出

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;
}
public class MapModel extends HashMap<String, Object> {

    public void Add(MapModel other) {
if (other == null) return; for (String key : other.keySet()) {
this.put(key, other.get(key));
}
} public static MapModel LoadFromUrl(String UrlQuery) {
MapModel ret = new MapModel(); List<String> list = MyString.MySplit(UrlQuery, '&');
for (String item : list) { List<String> kv = MyString.MySplit(item, '=');
ret.Tourch(kv.get(0), kv.get(1));
} return ret;
} public void Tourch(String KeyPath, String Value) {
if (this.containsKey(KeyPath)) return; int sepIndex = GetNextCharIndex_SkipQuotes(KeyPath, 0, '.', '[');
if (sepIndex >= KeyPath.length()) {
this.put(KeyPath, Value);
return;
} char chr = KeyPath.charAt(sepIndex); String objKey = KeyPath.substring(0, sepIndex); if (chr == '.') {
if (this.containsKey(objKey) == false) {
this.put(objKey, new MapModel());
} MapModel vv = (MapModel) this.get(objKey);
vv.Tourch(KeyPath.substring(sepIndex + 1), Value);
} else {
if (this.containsKey(objKey) == false) {
this.put(objKey, new ArrayList<Object>());
} List<Object> list = (List<Object>) this.get(objKey); int nextDotIndex = KeyPath.indexOf('.', sepIndex + 1);
if (nextDotIndex < 0) {
nextDotIndex = KeyPath.length();
} List<String> aryIndexs_Strings = MySplit(TrimWithPair(Slice(KeyPath, sepIndex, nextDotIndex).replace(" ", "").replace("][", ","), "[", "]"), ',');
List<Integer> aryIndexs = new ArrayList<Integer>();
for (String k : aryIndexs_Strings) {
aryIndexs.add(MyObject.AsInt(k));
} MapModel vv = (MapModel) PatchArrayLevels(list, aryIndexs, Value, KeyPath.indexOf('.', sepIndex + 1) > 0, 0); if (vv != null) {
vv.Tourch(Slice(KeyPath, nextDotIndex + 1), Value);
return;
}
}
} /// <summary>
/// a[0][0][0].Id = 1 , 则创建3级数组,返回 字典
/// </summary>
/// <param name="list"></param>
/// <param name="indexs"></param>
/// <param name="Value"></param>
/// <param name="NextIsDict">下一个对象是否是字典。</param>
/// <param name="level"></param>
/// <returns></returns>
private static Object PatchArrayLevels(List<Object> list, List<Integer> indexs, String Value, boolean NextIsDict, int level) {
int index = indexs.get(level);
if (level >= (indexs.size() - 1)) {
if (NextIsDict) {
for (int i = list.size(); i <= index; i++) {
list.add(new MapModel());
}
list.set(index, new MapModel());
return list.get(index);
} else {
for (int i = list.size(); i <= index; i++) {
list.add(null);
}
list.set(index, Value);
return null;
}
} for (int i = list.size(); i <= index; i++) {
list.add(new ArrayList<Object>());
} return PatchArrayLevels((List<Object>) list.get(index), indexs, Value, NextIsDict, level + 1);
}
}

具体实现参考开源项目的实现,项目地址: http://code.taobao.org/svn/MyJavaMvc

2. 属性名

1. 狗B的Java到底做了什么 , 为什么实体属性是 isAdmin : Boolean ,客户端会返回 admin : Boolean

2. 为什么SB的 Mongo驱动,会把 集合里的 id 变为 _id

3. 最后一个SB的坑。 前端Post如下数据:

cartIds[0].id:596713322b3fe4306a3a60f7
cartIds[0].number:10000
cartIds[0].amount:30000

  后端来接收:(Kotlin语法,和Java执行原理一样)

  data class abc(var cartIds: Array<CommitOrderDataItem> = arrayOf()){}

    @ApiOperation(value = "生成订单")
@JsonpMapping("/toOrder")
fun toOrder(@ApiParam("购物车中的id,number,amount的集合") abc:abc ){ //再取出来。
var cartIds = abc.cartIds;
}

3. 依赖

文件上传,使用 CommonsMultipartResolver  不报错, 编译不报错, 运行时报错。 添加以下依赖解决了。

<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.3</version>
</dependency>

Java就是狗屎  !!!

4.   @WebFilter 和   @Configuration 冲突。

在 Get 请求时,会执行两次 filter

  

狗屎的Java规范的更多相关文章

  1. 狗屎的asp.net core 果然发生了重大的变更

    狗屎的asp.net core  果然发生了重大的变更 ....仔细看官方的文档,想骂娘....你发布版本的时候,能不能先想好先设计好再发布?朝三暮四...大撒笔....你老这样变来变去,谁还敢碰你啊 ...

  2. Java规范推荐

    Java规范推荐 推荐:http://blog.csdn.net/tristansmile/article/details/7989670 命名规范 项目名:全部小写 Package 的命名:应该都是 ...

  3. 普天同庆,微博开通,从今以后,努力用功! 狗屎一样的顺口溜!Q狗屎!!狗屎。。。。。 测试。。测试。。。没刷过微博。屯里来的。看看啥效果

    普天同庆,微博开通,从今以后,努力用功! 狗屎一样的顺口溜!Q狗屎!!狗屎..... 测试..测试...没刷过微博.屯里来的.看看啥效果

  4. 一个关于狗记录的Java练习

    package 狗场;import java.util.*;public class dogRoom { /** * 作者.范铭祥 * 狗场的狗体重查询问题 */ public static void ...

  5. 资深投资人全力反击: VC增值平台从来就不是一坨狗屎

    编者注: 本文来自海外著名科技博客VentureBeat, 英文原文出自Kyle Lacy之手 ,中文版由天地会珠海分舵进行编译. 文章主要是针对前几天德国VC Christian Claussen的 ...

  6. java规范与标准?

    所谓规范,即指由很多人同时遵守的行为或理论. java的规范并不是指其中一种,而是有很多种,比如java编码规范,java命名规范,java虚拟机规范等等,甚至于一个编码规范都有很多种,不同的公司.组 ...

  7. 关于autoupgader的狗屎问题

    由于win7和xp的权限问题,导致这个自动升级玩意不正常.这个狗屎问题很简单,把exe文件的兼容性设定该一下.真是气死洒家了.

  8. JAVA规范

    ---------------------------------------------------------- Web Service技术 --------------------------- ...

  9. java规范之checkstyle

    1. 概述 随着中心的代码规范的建立和实施,项目组对代码规范要求,以及软件工程师们对自身代码的编写规范重要性的认知,“代码规范”已经成为了中心的一个“热词”.然后怎么才能写出有规范的代码,怎么才能养成 ...

随机推荐

  1. 常用的JAVA集合讲解

    java.util包中包含了一系列重要的集合类,而对于集合类,主要需要掌握的就是它的内部结构,以及遍历集合的迭代模式. 接口:Collection Collection是最基本的集合接口,一个Coll ...

  2. Oracle索引梳理系列(三)- Oracle索引种类之反向索引

    版权声明:本文发布于http://www.cnblogs.com/yumiko/,版权由Yumiko_sunny所有,欢迎转载.转载时,请在文章明显位置注明原文链接.若在未经作者同意的情况下,将本文内 ...

  3. Nginx问题定位之监控进程异常退出

    nginx在运行过程中是否稳定,是否有异常退出过?这里总结几项平时会用到的小技巧. 1. 在error.log中查看是否有signal项,如果有,看看signal是多少. 比如,这是一个异常退出的情况 ...

  4. mysql截取longblob类型字段内一小块数据的方法

    由于longblob类型的字段内容一般都好大,最大限制是4G,所以在数据查询中读取一整块数据的方式是不现实的,这需要要截取的方法来获取需要的数据. 方法如下: hex(substring(A, ind ...

  5. ES6 Set/WeakSet

    ES6里加入了一个新数据解构Set,和Java的Set一样,它里面不存放重复的元素.Set实现为一个类,使用时需要先new. var s1 = new Set() s1.add(1) s1.add(2 ...

  6. 我了个大擦-PDO(二)

    hi 昨天又213了,虽然有室友3点多才睡觉的客观影响,但是昨晚不想学东西是本质原因.今天搞起.打算3.4天之内,学完PDO和AJAX这两个,还望大家没事儿来骂骂我,免的我又偷懒. 1.PDO 二.P ...

  7. Java实现点击一个控件实现删除一个控件的方法

    最近在做项目的时候需要处理点击一个JLabel实现删除这一个JLabel的功能.最近折磨了一点时间,查了一下API.找到2个方法可以实现这个功能. remove public void remove( ...

  8. css常见的易混淆属性和值的区别(一)

    css的属性很多,每一个属性的值也很多,组合起来便有成千上万种.不同属性之间的相互组合也可以产生不同的样式,css真是一种优美的样式设计语言.下面对工作中常见的易混淆的属性和值进行总结: 1. lin ...

  9. 用jsmooth + inno生成exe并制作简单安装包

    思路: 先由 Jsmooth把jar和相关资源打包生成exe,再由Inno把exe和资源文件打成安装包 一  Jsmooth 1 下载 安装 Jsmooth   地址:jsmooth.sourcefo ...

  10. IT菜鸟的3(for循环+分支语句)

    第三天学的东西感觉已经不是很容易能想通了,感觉头懵懵的,难道这就是是文科生的障碍吗,我不相信,坚持!相信自己一定会做好! 1:for循环!(1)循环四要素:初始条件,循环条件,循环体,状态改变for( ...