Java现在已经快14岁了,而且这个时代已经开始显现.在我的行业(银行业),我们开玩笑说Java是21世纪的COBOL; 除了它不是一个笑话,这是悲伤的现实.
Java有许多"包袱",这些"包袱"是为了向后兼容而保留的 - 这对于像银行这样的客户来说至关重要.但我经常认为现在是重启的时候了.只需阅读"Java Puzzlers"即可找到语言设计中的痛点列表.我不是在责怪语言设计师 - 在过去的14年中学到了很多经验教训!但是,我真的很喜欢一些重大变化,这些变化可以很好地打破向后兼容性,同时使语言更好.
以下是我在语言中更改的(非常部分)列表:
删除所有已弃用的项目.现在是时候了,Thread.stop和好友会死.
禁止超载.那是一个错误.(我知道这个有点有争议,但......)
构造者必须是私人的.静态方法应该用作工厂方法来获取实例.这允许主要和重要的优化.(再次,有争议,但学术界似乎同意.另见有效Java中的第1项.)
删除死的/错误设计的API部分.特别是,修复Date类.
放下"敲定".
删除对泛型类的"原始"变体的支持.没有更多的List
; 它必须是List
.
属性.当你在它时,没有非私人领域.
提供"equals"的默认实现,迭代字段并调用它们的"equals"; 允许一些注释("@NonState")标记不属于相等测试的字段.
"=="应该调用equals(); 添加一个新的运算符"is",用于标识.
从Object中删除"clone"; 只有实现Cloneable的对象才应该有这个方法.
为测试类提供特殊注释; 测试类应该能够访问同一个包中所有类的私有成员.
在库中充分利用Enums - 很明显,许多旧类使用int常量代替.
删除"Thread.run"; Thread.start应该接受一个Runnable对象(你会惊讶于我看到的调用Thread.run而不是Thread.start的bug数量).
这只是我的头脑......所以,我想听听:
你是否同意重启Java(一个破坏与旧代码兼容的新版本)将是一件好事?
什么是你的宠儿,你认为需要用语言固定的东西?我自己的例子集中在可复杂性破坏项目上 - 在当前Java中你不能做的事情而不破坏现有代码.但也欢迎其他想法.
澄清:我不是在寻找一种新语言(如Scala或C#).我正在寻找一些显然仍然是Java的东西 - 但需要为现有代码进行一些移植工作.请注意,对于我建议的许多更改,代码可以自动或半自动移植.我知道银行不会很快采用它(嘿,我在那里工作)但我也知道银行经常开始新项目,并且喜欢利用现有程序员的知识,同时享受更好的语言.
对于所有那些声称,对于我的许多建议,团队可以只执行自己的规则(例如,没有超载):足够真实,但我们高度依赖第三方代码.不是每个人?
我不认为语言会得到这种极端的改造,特别是不会像你的建议那样以百万种不同的方式打破后向兼容性.相反,你会得到一种新语言.
好吧,我不得不说,无论C#,Scala或Groovy粉丝是否愿意同意,我认为这里的一些建议完全是愚蠢的.
1)任何错误调用Thread.run而不是Thread.start的人都不应该编程.这里的程序员有错,而不是框架或语言.
2)禁止超载?为什么,为什么你会这样做呢?再说这没有意义,它会导致什么问题?我发现在任意数量的场景中,重载非常有用.
3)工厂方法和构造函数之间的真正区别是什么.这是构造函数,它们是创建对象实例的工厂方法.如果您想要或更喜欢工厂方法,那么实施它们......并不难
4)==调用equals(),运算符重载是面向对象领域的最糟糕的想法之一.您是否意识到复杂的C++程序可以通过一组重载运算符来实现.它不明显,需要耗时的分析.
5)如果删除了已弃用的方法,Java将完全死掉.为什么不忽略它们呢?每种语言都朝着这个方向前进,没有语言是完美的,只有开发人员继续使用并升级才能错过错误.
虽然你的一些评论是有道理的,但我发现缺乏经验会使人们倾向于原则和理想,并且凭借经验,你会发现实用主义才是最重要的.为什么让Java完美无缺,重要的是它可以用它做什么.我认为闭包,具体化的泛型和属性是唯一需要的基本增强功能.
Java不是一种娱乐玩具,它在这里很受欢迎,因为企业都是以它为基础并依赖它.