?????????????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?????????“δ?????”??“??????”?????塣