?????????????Josh Bloch??Effective Java??????????10??Java??????????斜????Josh Bloch???斜???????????????????????????斜???????婕�API/SPI????胁?????????????????泻?????
?????????写?????jOOQ(Java?????DSL?????SQL)?????????些???????????DSL??jOOQ???????????Java??????????????????????????????????????Josh Bloch??????????????????????API??
???????????????10??????Java??????????
????1. ?渭?C++??????????
???????C++????????????????????????????????????????????????些?????????????????????斜????????????泄????????谢Sun/Oracle?????????????????
??????????????????????????????????????????????????????????妾�?????Java?????????????????????????????????
???????JUnit??@Before??@After???
???????????JDBC???
????????super????
???????????????????????????????????????????????????些???????????SPI??
????@Override
????public void beforeEvent(EventContext e) {
????super.beforeEvent(e);
????// Super code before my code
????}
????@Override
????public void afterEvent(EventContext e) {
????// Super code after my code
????super.afterEvent(e);
????}
?????????????????????????????????????????????????? ??????????貌??????????????
????http://adit.io/posts/2013-05-11-The-Dining-Philosophers-Problem-With-Ron-Swanson.html
?????????????????before/after?? allocate/free?? take/return???????????????????????????after/free/return??????
????2. ??????????????SPI????卸?
??????????SPI????????????????????/???????????????????????????????SPI????卸?????????????????? (??)???????????????? ????????????????????????????????????SPI?????????????????姹�????????????????????????????????????????????????????????SPI????????????????????????:
????interface EventListener {
????// Bad
????void message(String message);
????}
????????????????ID?????????????API????????????????????????????????????????Java8?????????????defender??????“????”?????????????????
????interface EventListener {
????// Bad
????default void message(String message) {
????message(message?? null?? null);
????}
????// Better?
????void message(
????String message??
????Integer id??
????MessageSource source
????);
????}
???????????????defender???????????final???畏???
?????????????????????????SPI??????????????(???????????)??煤??
????interface MessageContext {
????String message();
????Integer id();
????MessageSource source();
????}
????interface EventListener {
????// Awesome!
????void message(MessageContext context);
????}
????????EventListner SPI?????????????MessageContext API?????????????????????
????????: ?????????SPI????????????????/??????????????写???泄?????????????
???????: ???????MessageResult?????????????????????????????????y?????API?????????????????????SPI????????????
????3. ????????????????????????
????Swing?????????????????????????????????????????????????锟�?????????????违??SPI???????????????(SPI subtype lifecycle)?????????????? ???????????????????——???????????????????????????????????????????????????????????????????????????纾�???????????????????????????????????????????浠�??????????????泄???
???????????写???????????????????????????????????????????????????????????????????????????小?
??????????????????????????????
????new HashMap<String?? String>() {{
????put("1"?? "a");
????put("2"?? "b");
????}}
????????????????? JLS §8.6?娣�????????????????????(initializer)????????????????????????????????????????????????????????HashMap????????????????????????????????谩?????????????????????????????
????4. ????????写SAM??
????Java8???????????????Java8??????lambda???????????????????????????API??????????????????????????????????????????谩??????????API???????“????”?????????int??long??String ??Date???????????API??????????????SAM??
????????SAM??SAM??????????[????]???????????????????????@FunctionalInterface?????????2????EventListener??????????SAM?????SAM?????????????????????????lambda???????写???????写
????listeners.add(c -> System.out.println(c.message()));
?????????
????listeners.add(new EventListener() {
????@Override
????public void message(MessageContext c) {
????System.out.println(c.message()));
????}
????});
??????????JOOX??????????XML??JOOX????????SAM??
????$(document)
????// Find elements with an ID
????.find(c -> $(c).id() != null)
????// Find their child elements
????.children(c -> $(c).tag().equals("order"))
????// Print all matches
????.each(c -> System.out.println($(c)))
?????????????API?????????????????????写SAM/????????
?????????????????Java8 lambda??????????Collections API???????????
????http://blog.informatech.cr/2013/04/10/java-optional-objects/
????http://blog.informatech.cr/2013/03/25/java-streams-api-preview/
????http://blog.informatech.cr/2013/03/24/java-streams-preview-vs-net-linq/
????http://blog.informatech.cr/2013/03/11/java-infinite-streams/
????5.?????梅???????null
????????写??1??2?????java NULLs?????锟�???????Java8???????渭?Optional???????????????????????些??????????????
????????????Null??NullPointerException?????Java?????????????????????????????魏??????API???????API?????????????????梅???????null??????????????????????梅?????
????initialise(someArgument).calculate(data).dispatch();
??????????????锌???????魏?????????????????null?????????????????????null??????????????? jQuery?? jOOX?????????????????????????????????null??
????Null???????????????小??????????锟�?????????????????????锟�???????????????????????????婕�???????????????????????????????
???????????????????????????null??null?????????“未?????”??“??????”?????濉�