Java 最困扰你的那些事

啊哈Reddit,没了你咱们还能在哪里从鱼目混珠的网络中提炼真正的精华?就在这杂乱无章的论坛中,的的确确存在着这样一些精辟的讨论。html

好比有个叫Shambloroni的兄弟发起了一个引发普遍共鸣的话题(收到了150个回复和投票)。话题的开始是他在吐槽 Java 有哪些方面最让他感到厌烦,同时他又向其余程序猿征集关于编写Java时使人蛋疼(伤感……)的故事。java

下面我列出了一些最有意思的回复——你会赞成吗?python

Try-catch 声明之殇

虽然我才刚刚开始编写 Java 程序,可是在Java 中实现让程序停顿一些时间而后继续运行这件事情已经复杂的令我震惊。除了写下基本的指令完成停顿外,我还必需要用 try-catch 来包裹的这些操做。没准对于大牛来讲这不算什么,可是对我来说这太使人难过了。程序员

还有跟全部 IO相关的异常也让许多简单的事情变得繁琐起来。好比我仅仅想简洁地作些事情,但最后老是会搞砸,。而后我不得不在全部方法上加上“throws Exception”。安全

没有,没有,仍是没有

  • 没有无符号的整形。
  • 没有操做符重载。
  • 没有对象属性。
  • 没有代理

我一样痛恨不少 Java 库中引入模块的方式(好比根据名称加载模块)。相对而言,我更但愿在编译时就能检查我须要的依赖库是否已经加载了。网络

找不到爱…

我恨 Java,就是单纯的恨。负责任地说,我从不使用 Java 写程序的最大因素就是由于我恨它。还有一点就是JRE糟糕的模块化。就算你用了一些加载工具好比Launch4j,你仍然须要让用户安装一个超过200 MB 的框架来运行程序。框架

没有getter、setter

Java还缺乏getter和setter注解。这样能够更简单的添加和移除模板代码。模块化

缺少亮点

Java 缺乏一些杀手级的模块。虽然据说一些不错的模块将被加入到Java 9.x 中,但目前为止这是我最大的槽点了。函数

非暴力不合做

我遇到的最大的麻烦就是如何一块儿使用基本元素和对象。例如, 把一个char[]类型的变量转换成一个列表别提有多费劲了,并且我感受这种操做根本不必这么麻烦。工具

心愿单

  • 我最想要的就是像 Perl 中那种上下文相关的函数了,以及当处理真正的异常时,这些函数能够在一个语言中所扮演的角色。
  • 我还但愿 Java 能够支持智能打包返回值,这样咱们就能够像在Perl中那样返回一个包含多个值的列表了。
  • 我但愿使用异常的标准库还能够在不适合抛出异常的场景下使用并可以处理失败。
  • 还有,另外一个烦人的地方就是我在用 StringWriter 时候还要处理 IO 异常。

还缺些什么

  • 缺乏宏对我来讲使 Java 减分很多(我并不说在 C/C++ 中使用的预处理器宏,而是在Lisp/Scheme 中使用的那种宏)。
  • 不论作什么事情你都须要定义一个类,尽管你可能根本不须要一个类。比方说,我想把一段常用的代码提取出来,而后在须要地方使用——为了达到这个目的,我必需要把这段代码封装成一个final static的方法,并放在一个类中。这样一来我还得费劲去给类取一个方便理解的名字……原本这事儿能够很简单(这确实很简单, 尤为是当你能够定义宏的时候)。

有没有搞错

  • 缺少对泛型的支持。C++ 中的模板要强大的多。
  • 事实上,在Java 中你根本不能在泛型中实例化一个类,除非你把这个类做为参数来声明一个泛型。
  • 你很难给一个类加上结构函数并让它销毁这个类。RAII(一种资源管理模式,见 C++)却一直很是有用。
  •  没有操做符重载。C++ 容许你是将 == 操做符用于比较字符串。一样的,大整数运算由于一样的缘由变的很难使用。

呃, 好吧

没有无符号的基础类型。这尼玛是闹哪样啊!

仍是getter、setter

  1. null(最大槽点)。

  2. 没有getter和setter注解(例如,没有属性)。

  3. Java 只支持位置参数。我喜欢像Smalltalk 那种支持多样化的参数形式,或者是强制使用关键字参数的Python 3。

    好比在 Samlltalk 中调用一个具备两个参数的函数,能够这样作:

    myInstance myMethodWithFoo: arg1 Bar: arg2

    在 Python中你可使用下面的语法来调用函数并给函数参数赋值:

    my_inst.my_method(foo=arg1, bar=arg2)
  4. 不支持多分派(Multiple Dispatch)?

这些是我最早想到的,不过以为应该还有更多。认真地说,使用回调函数一直是一个大问题,由于它太麻烦了。不过Java 8 中解决了这个问题,我仍是很开心的 =)

愚蠢的默认值

  • 默认的可见性。若是没有给变量或方法一个修饰符,那么这个方法应该是私有的,而不是包内可见。
  • 默认的修改能力。最终类型(在全部状况下)应该是默认的,并用“var”做为修饰符。目前的状况是,程序员不多会把一个方法的参数设置为最终类型,由于那样会让变量很快变得不可读。同时,在一个方法中重写参数也是不多见的状况。
  • 集合接口。Java 中应该提供一个可写的集合接口,如今集合继承自这个可写的接口,只是把全部改变集合内容的方法屏蔽掉。这样就会减小如今你会在Collections.unmodifiable……() 和一些第三方的API中见到的那些使人困惑的历史遗留方法。有了可写的集合接口,Java 将会变得更加类型安全。
  • 缺乏表达能力。在用过Scala(或是最新的PL)以后, 你会以为Java 很是的繁琐。这是最多见的关于Java 的吐槽,但它这就是事实。

说说异常

被强迫的处理异常——真主保佑你。谁能告诉我为何我非要用try-catch 来包裹每个Thread.sleep()……?我历来就没有真正见过那个我被要求去处理的InterruptedException。

我知道我要说的可能不是一个普遍承认的问题,可是我真的赞成checked exception(应被检查的异常)很烦人。这些异常让代码变得面目全非还让重构变得不可能。我明白他们为何存在(并且理论上也说的通),可是他们没为开发者带来什么实质好处。不论你作什么,都不要留一个空的catch 块,就算你认为这个异常永远不会发生。你大能够把这个checked exception用RuntionException(运行时异常)从新封装一下,再抛出去。


原文 jaxenter
翻译 ImportNew - 靳禹