不要信任你早期SPI演化的结论给客户提供SPI是一个简单的方式让他们在库或者代码中注入自定义的行为。但是请注意,你的SPI演化结论可能会欺骗你,让你觉得你可能(不再)需要那个参数。是的,任何功能都不应过早的加入。但是一旦你发布了你的SPI并且你决定遵循语义的版本控制,你就会后悔自己在SPI中加了一个愚蠢的,只有一个参数的方法,你意识到在某些情况下你还需要另一个参数:
开始写SAMs吧(single abstract method)单个抽象方法Java8已经在敲门了。无论你喜欢与否,Java8会带来lambdas表达式。但你的API使用者可能会喜欢他们,你最好是确认他们可以尽量多的使用这些。因此,如果你的API不接收简单的“标量”类型类如int, long, String, Date, 那么就让你的API尽量多地接收SAMs吧。什么是SAM? SAM是Single Abstract Method[Type], 即单一抽象方法,也称作函数式接口(Functional Interface)。它即将使用@FunctionalInterface注解。这与规则2并无出入,因为EventListener实际上就是一个SAM. 最好的SAM应该只有一个参数,进而可以简化为一个lambda表达式。
API方法永远不要返回null数组或null链表检查null值有必要吗?大多数I/O操作产生的是IOException,但是这个返回了null,Null不能保存任何错误信息来说明为什么会发生这个I/O错误。所以这里错在三方面:Null无助于找到错误。Null并不能区分是I/O错误还是文件的实例不能表示一个目录。在这里,任何人都记不住这个null。在collection contexts(集合上下文)中,“absence”(缺席)的概念最好使用空的数组或集合来实现。除非是延迟初始化,否则“缺席”数组或集合几乎从不使用。
默认把方法设为final有些人并不同意这一点,因为默认把东西设为final跟java程序员们通常所作的格格不入。但是如果你对于源代码有完全的控制,默认把方法设为final绝对不会有任何错,因为:如果你需要重写一个方法(真的需要么?),你仍可以删掉final关键词。你永远不会意外地重写某个方法。
记住C++的析构函数要记住C++的析构函数(C++ destructors)?不想这样做?那你得很幸运以至于从来不需要调试那些由于分配内存而没有在对象移除后释放内存而导致内存泄露的代码。感谢Sun/Oracle实现了垃圾回收机制。