十一年开发经验, 谈谈Java那些令人讨厌烦人恶心的语法

本文主要是介绍十一年开发经验, 谈谈Java那些令人讨厌烦人恶心的语法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

搞了十几年Java开发, 我写的代码早过几百万行, 有没有一千万我就不知道了
遇到了很多令人头痛的语法, Java 你死不死啊
回头来看, Java真的让我多些了太多无用代码
今天我对比了其他脚本语言, 跟大家谈谈Java这些恶心的语法

Java语法过于严谨, 导致语法繁琐

1. 缺少 getter setter 的支持

11年前我看马士兵的Java视频教程 还记得当时他说到一个案例:

一个Java设计人员, 把Java AWT 里面的一个Point类的x, y属性给public暴露出来了, 然后被大家在代码里面大范围调用: point.x = 123 point.y =520 … , 后来这个设计人员被项目经理痛批了一顿:
" 给你说了类的属性必须要private ! , 调用必须用getX() setX() getY() setY(y)"
直到现在, Point类的x, y 属性都还是public的, 不能改回private

对于这个案例, 我想说, 为什么java就不能在编译器上支持getter 和 setter
比如这样写:

//类定义:
class Point{int xint yget x() {return x}set x(x) {this.x = x}
}//外部调用:
Point point = new Point()
point.x = 1 //setter
point.y = 2 //setter
System.out.println(point.x) //getter

这样语法会更加简洁, 写起来更爽, 也解决了那个设计人员当时犯下的错误
(你说这是错误? 这么多年过去了, Point类相关代码肯定超过亿行, 而这个所谓的错误, 也没有造成什么坏影响)

2. 必检 try catch

Java编译器你不累吗

我草你大爷干嘛编译报错???

好烦人的try catch

哦, 原来你是希望我这样写…
可能大概是这样会更严谨…
问题来了 我改在catch里面写点什么好呢?

我是写System.out.println(“草你大爷老子找不到文件”)
还是写System.out.println(“草你大爷老子真的找不到文件呢”)

这是开发人员和和Java设计人员来自灵魂的交流…
最后我妥协了:

File file = new File("D:/1.txt");
FileInputStream fis = null;try {fis = new FileInputStream(file);
} catch (FileNotFoundException e) {//王炸! 要不起throw new RuntimeException(e);
} try {fis.read();
} catch (IOException e) {//大哥我把异常还给你throw new RuntimeException(e);
}//聪明了一手, 把sleep方法封装了一下
sleep(1000);System.out.println("你找不到文件就找不到文件呗, 你找不到文件你系统报错就行了!");
System.out.println("你找不到文件的时候, 千万不要打印这句话, 你死机我给你满分");private static void sleep(long ms) {try {Thread.sleep(ms);} catch (InterruptedException e) {//写了十几年代码, 就从来没有成功执行过这一行System.out.println("求求你运行到这里行不行")throw new RuntimeException(e);}
}

原本简简单单的3行代码活生生的被写成了这个样子, 面对Java编译器你和我也是无可奈何…

3. 缺少方法引用的支持

callBack = function(data) {print(data)
}
httpRequest("http://www.baidu.com", callBack)

比如就这么简单几行代码 (功能就是打印百度首页信息)
换到Java里面就必须得这样:

interface CallBack {void callBack(String data);
}CallBack callBack = new CallBack() {public void callBack(String data) {System.out.println(data);}
}
httpRequest("http://www.baidu.com", callBack);

Java你死不死啊, 烦不烦啊, 一个方法引用必须要去定义一个接口才能完成
听说Java8好像支持Lambda 表达式… Lambda 可惜表达式没有方法引用好用
在编写异步代码的时候, 如果有方法引用, 可以少写太多代码

4. 缺少中转对象的支持

我想你在代码里面经常都需要一个中转对象,
这个对象只是简简单单的设值和取值, 不需要实现任何功能方法
其他语言写法:
(不需要提前声明类, 直接生成对象)

function getStudent() {var student = {name: "xx",age: 12}return student
}

Java 的写法:
所谓的Java Bean
知道Bean是什么意思吗?? 就是憨豆
憨, 重庆话读作莽子
也就是Java的莽子写法
再翻译一下就是Java撒逼写法


class Student {String name;int age;String getName() {return this.name;} int getAge() {return this.age;}String setName(String name) {this.name = name;} int setAge(age) {this.age = age;} 
}public Student getStudent() {Student student = new Sdudent()student.setName("xx")student.setAge("xx") return student
}
//再一次跟Java的设计人员来了一次灵魂的沟通
//大哥我不想去定义Student这个类, 太烦了

看看这么大篇代码, 烦不烦啊, 死不死啊
这种对象根本不需要提前声明嘛, 而且随着student属性的增多,
student类的代码行数也跟着增多
我还需要后期维护这个没卵用的Bean类

5. 接口虽好, 但太复杂

在你学Java的时候, 是不是觉得Interface很让你疑惑?
你疑惑就对了, 相信你自己, 你疑惑一个东西的时候
说明这个东西并不是什么非常好的东西
比如给你写一篇文章, 官话套话一大堆, 中心思想不知道在哪里
让你疑惑了, 这篇文章好吗? 答案肯定是不好

我对Interface(接口) 做了深入研究
最终还是有了伟大的发现!
你们知道Interface到底是什么吗? 作用是什么吗? 作用有多大?
我写了一篇文章讲了接口是什么鬼东西, 点击查看

Interface 象征 : 严谨 + 繁琐

Interface是什么: 对象暴露给外部使用的功能集
Interface作用: 所谓的降低类和类耦合度, 我说事实并不是这样的
Interface作用有多大: 作用没多大

Interface 是严谨了, 但是它让Java代码量增多

我们不应该去依赖接口来降低耦合度,
我推荐大家应该多多使用一些设计模式:
这里我特别推荐一定要多多使用事件模式:

lady.on("fuck", function() {bed.rock()
})

这是降低lady和bed间耦合度的非常好的办法!
在这段代码里, 代码的耦合度关接口什么事? 半毛钱关系都没有

没有接口的语言, 和Java这种有接口的语言比起来, 我总结了一下:
有没有接口这个东西, 都没关系, 都能完成我需要的功能

接口对项目经理还是有那么一点点用, 就是项目经理给你定义个接口, 叫你你你去给我把这个接口实现了今天就可以下班了
(没有接口不代表这个工作就分配不下去了)

有接口就是写起来复杂点, 不过没有接口我照样不会犯错误…
接口我用得很多,
但接口没给我带来的太大的好处, 真的没有
简单语法的编程语言,根本不需要接口

6.还有太多槽点我不想写了…

一个开发语言之所以能被广泛使用,
最主要的两个原因: 宣传力度,
大量类库支持

缺少类库的开发语言, 语法再简单也没人愿意使用, Java为什么能流行起来, 并不是书上说的什么鬼的安全性… 主要就是因为类库很完善 + 广告做的大
Java虽烦, 但类库支持非常全面, 也会让你少写很多代码

Java 8 之后的新语法我都没有去看了, 这些问题在Java8之后有没有改正我也不知道, 因为我基本上已经放弃Java 去使用其他语言

这篇关于十一年开发经验, 谈谈Java那些令人讨厌烦人恶心的语法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/303944

相关文章

Java编译生成多个.class文件的原理和作用

《Java编译生成多个.class文件的原理和作用》作为一名经验丰富的开发者,在Java项目中执行编译后,可能会发现一个.java源文件有时会产生多个.class文件,从技术实现层面详细剖析这一现象... 目录一、内部类机制与.class文件生成成员内部类(常规内部类)局部内部类(方法内部类)匿名内部类二、

SpringBoot实现数据库读写分离的3种方法小结

《SpringBoot实现数据库读写分离的3种方法小结》为了提高系统的读写性能和可用性,读写分离是一种经典的数据库架构模式,在SpringBoot应用中,有多种方式可以实现数据库读写分离,本文将介绍三... 目录一、数据库读写分离概述二、方案一:基于AbstractRoutingDataSource实现动态

Springboot @Autowired和@Resource的区别解析

《Springboot@Autowired和@Resource的区别解析》@Resource是JDK提供的注解,只是Spring在实现上提供了这个注解的功能支持,本文给大家介绍Springboot@... 目录【一】定义【1】@Autowired【2】@Resource【二】区别【1】包含的属性不同【2】@

springboot循环依赖问题案例代码及解决办法

《springboot循环依赖问题案例代码及解决办法》在SpringBoot中,如果两个或多个Bean之间存在循环依赖(即BeanA依赖BeanB,而BeanB又依赖BeanA),会导致Spring的... 目录1. 什么是循环依赖?2. 循环依赖的场景案例3. 解决循环依赖的常见方法方法 1:使用 @La

Java枚举类实现Key-Value映射的多种实现方式

《Java枚举类实现Key-Value映射的多种实现方式》在Java开发中,枚举(Enum)是一种特殊的类,本文将详细介绍Java枚举类实现key-value映射的多种方式,有需要的小伙伴可以根据需要... 目录前言一、基础实现方式1.1 为枚举添加属性和构造方法二、http://www.cppcns.co

Elasticsearch 在 Java 中的使用教程

《Elasticsearch在Java中的使用教程》Elasticsearch是一个分布式搜索和分析引擎,基于ApacheLucene构建,能够实现实时数据的存储、搜索、和分析,它广泛应用于全文... 目录1. Elasticsearch 简介2. 环境准备2.1 安装 Elasticsearch2.2 J

Java中的String.valueOf()和toString()方法区别小结

《Java中的String.valueOf()和toString()方法区别小结》字符串操作是开发者日常编程任务中不可或缺的一部分,转换为字符串是一种常见需求,其中最常见的就是String.value... 目录String.valueOf()方法方法定义方法实现使用示例使用场景toString()方法方法

Java中List的contains()方法的使用小结

《Java中List的contains()方法的使用小结》List的contains()方法用于检查列表中是否包含指定的元素,借助equals()方法进行判断,下面就来介绍Java中List的c... 目录详细展开1. 方法签名2. 工作原理3. 使用示例4. 注意事项总结结论:List 的 contain

Java实现文件图片的预览和下载功能

《Java实现文件图片的预览和下载功能》这篇文章主要为大家详细介绍了如何使用Java实现文件图片的预览和下载功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... Java实现文件(图片)的预览和下载 @ApiOperation("访问文件") @GetMapping("

Spring Boot + MyBatis Plus 高效开发实战从入门到进阶优化(推荐)

《SpringBoot+MyBatisPlus高效开发实战从入门到进阶优化(推荐)》本文将详细介绍SpringBoot+MyBatisPlus的完整开发流程,并深入剖析分页查询、批量操作、动... 目录Spring Boot + MyBATis Plus 高效开发实战:从入门到进阶优化1. MyBatis