最近StephanSchmidt在博客中发表了题为《下一代Java编程作风》的文章,阐述了他眼中Java编程作风的改动,以及将来的走向:许多公司和开发人员正在从Java转向其他编程言语:Ruby、Python、Grrovy、Erlang或Scala等等。不过你能够做不到这一点。即便如此,你也可以改动你的编程作风,获取这些新言语的优势。事实上,在过去的15年中,Java编程作风也已经有分明变化了。
Stephan在文章中提出了以下几点:
尽能够地标注final:让一切东西不可变,把变量标为final可以阻止改动它的值。很多时分,重新为变量赋值会引入bug,你应该使用新的变量。除此之外,final可以进步代码的可读性。我针对这个话题还写过一篇文章:《Java中一切变量都应该是final的》
没有setter:许多Java程序员会自然而然地为类中一切的字段加上setter。思索一下,真的每个字段都需要修改吗?更好的方法是创立包含改动后状态的新对象。此外,也试着去除getter,我们应该遵照“Tell,don’task”的思想。
避免使用循环来操作List:从函数式编程那里获得的经验,循环并不是停止集合操作最好方法。例如,我们可以使用GoogleCollections提供的过滤功能。淘宝网特步
Predicate canDrinkBeer = new Predicate()
public boolean apply(HasAge hasAge)
return hasAge.isOlderThan( 16 );
List beerDrinkers = filter(persons, canDrinkBeer);
使用单行代码:Java是一门繁杂(noisy)的言语,我们应该编写更准确的代码。尝试将代码写为一行。例如:
public int add(int a, int b) return a + b;
使用少量接口:范围驱动设计已经大行其道,一个应该拆分为多种“角色”,即完成多种接口,进步复用程度。方法应该面向“角色”,而不是面向特定的类。我在《不要在Java中使用String》一文中讨论了更多这方面的内容。
使用Erlang作风的并发:Java的并发特性(如lock和synchronized)过于低端,难以使用。Erlang作风的并发是一种更好的做法。Java平台上已经有了Akka和Actorom。此外,也可以使用java.util.concurrent中的Join/Fork和数据结构停止编程。
使用Fluent Interface:FluentInterface可以使代码更短,更容易编写。GoogleCollections中的MapMaker是个不错的示例:
ConcurrentMap graphs = new MapMaker()
.concurrencyLevel(32)
.softKeys()
.weakValues()
.expiration(30, TimeUnit.MINUTES)
.makeComputingMap(
new n()
public Graph apply(Key key)
return createExpensiveGraph(key);
);