十一年开发经验, 谈谈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

相关文章

JVM 的类初始化机制

前言 当你在 Java 程序中new对象时,有没有考虑过 JVM 是如何把静态的字节码(byte code)转化为运行时对象的呢,这个问题看似简单,但清楚的同学相信也不会太多,这篇文章首先介绍 JVM 类初始化的机制,然后给出几个易出错的实例来分析,帮助大家更好理解这个知识点。 JVM 将字节码转化为运行时对象分为三个阶段,分别是:loading 、Linking、initialization

Spring Security 基于表达式的权限控制

前言 spring security 3.0已经可以使用spring el表达式来控制授权,允许在表达式中使用复杂的布尔逻辑来控制访问的权限。 常见的表达式 Spring Security可用表达式对象的基类是SecurityExpressionRoot。 表达式描述hasRole([role])用户拥有制定的角色时返回true (Spring security默认会带有ROLE_前缀),去

浅析Spring Security认证过程

类图 为了方便理解Spring Security认证流程,特意画了如下的类图,包含相关的核心认证类 概述 核心验证器 AuthenticationManager 该对象提供了认证方法的入口,接收一个Authentiaton对象作为参数; public interface AuthenticationManager {Authentication authenticate(Authenti

Spring Security--Architecture Overview

1 核心组件 这一节主要介绍一些在Spring Security中常见且核心的Java类,它们之间的依赖,构建起了整个框架。想要理解整个架构,最起码得对这些类眼熟。 1.1 SecurityContextHolder SecurityContextHolder用于存储安全上下文(security context)的信息。当前操作的用户是谁,该用户是否已经被认证,他拥有哪些角色权限…这些都被保

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

Java架构师知识体认识

源码分析 常用设计模式 Proxy代理模式Factory工厂模式Singleton单例模式Delegate委派模式Strategy策略模式Prototype原型模式Template模板模式 Spring5 beans 接口实例化代理Bean操作 Context Ioc容器设计原理及高级特性Aop设计原理Factorybean与Beanfactory Transaction 声明式事物

这15个Vue指令,让你的项目开发爽到爆

1. V-Hotkey 仓库地址: github.com/Dafrok/v-ho… Demo: 戳这里 https://dafrok.github.io/v-hotkey 安装: npm install --save v-hotkey 这个指令可以给组件绑定一个或多个快捷键。你想要通过按下 Escape 键后隐藏某个组件,按住 Control 和回车键再显示它吗?小菜一碟: <template

Hadoop企业开发案例调优场景

需求 (1)需求:从1G数据中,统计每个单词出现次数。服务器3台,每台配置4G内存,4核CPU,4线程。 (2)需求分析: 1G / 128m = 8个MapTask;1个ReduceTask;1个mrAppMaster 平均每个节点运行10个 / 3台 ≈ 3个任务(4    3    3) HDFS参数调优 (1)修改:hadoop-env.sh export HDFS_NAMENOD

Java进阶13讲__第12讲_1/2

多线程、线程池 1.  线程概念 1.1  什么是线程 1.2  线程的好处 2.   创建线程的三种方式 注意事项 2.1  继承Thread类 2.1.1 认识  2.1.2  编码实现  package cn.hdc.oop10.Thread;import org.slf4j.Logger;import org.slf4j.LoggerFactory