Jakkolwiek wątpię, abym często obcował z AclEntry i jej pobratyńcami, to cieszę się, że pojawiła się ta klasa, która uważam, że spopularyzuje ten sposób budowania API w Javie.
Skoro rysunek może zastąpić 1000 słów, to może przykładowy kod z AclEntry.Builder również?
package pl.japila.java7.nio2; import java.io.IOException; import java.nio.file.FileSystems; import java.nio.file.attribute.AclEntry; import java.nio.file.attribute.AclEntryFlag; import java.nio.file.attribute.AclEntryPermission; import java.nio.file.attribute.AclEntryType; import java.nio.file.attribute.UserPrincipal; import java.nio.file.attribute.UserPrincipalLookupService; public class AclEntryDemo { public static void main(String[] args) throws IOException { // who... UserPrincipalLookupService principalLookupService = FileSystems.getDefault().getUserPrincipalLookupService(); UserPrincipal principal = principalLookupService.lookupPrincipalByName("jacek"); System.out.printf("Principal: %s %n", principal); // ...does what. AclEntry aclEntry = AclEntry.newBuilder() .setType(AclEntryType.ALLOW) .setPrincipal(principal) .setPermissions(AclEntryPermission.LIST_DIRECTORY) .setFlags(AclEntryFlag.DIRECTORY_INHERIT) .build(); System.out.printf("ACL Entry: %s %n", aclEntry); } }Niezłe, co? A to wszystko dostępne w Java 7.
Przy okazji, warto zajrzeć na blog pragmatists.pl, w którym Paweł Lipiński przedstawił temat we wpisie Płynne interfejsy.
Czy ma ktoś pomysły, gdzie użyć AclEntry i jej podobych? A może już jest w użyciu u Ciebie? Jakie zastosowanie? Zachęcam do podzielenia się doświadczeniami, których mi zauważalnie brakuje.
Wszystkim eclipsowcom pragnącym zakosztować w 'płynnym' bodowaniu swoich obiektów polecam plugin Fluent Builder Generator.
OdpowiedzUsuńhttp://code.google.com/p/fluent-builders-generator-eclipse-plugin/
Jakoś nie podoba mi się tłumaczenie "płynny" i podana definicja. To bym nazwał raczej "chain invocation" niż "fluent interface". No i zwracanie ciągle tego samego obiektu nie zawsze jest dobrym pomysłem w przypadku drugiego, lepiej mieć różne "etapy" wtedy wywołania kolejnych metod ograniczają/zmieniają dostępne możliwości :)
OdpowiedzUsuńKrzysiek, a gdzie jest różnica między nimi? Dla mnie jeden nie istnieje bez drugiego.
OdpowiedzUsuńWzorzec budowniczy nie koniecznie musi być fluent. Z kolei fluent interface może być zastosowany nie tylko w tym wzorcu.
OdpowiedzUsuńW podanym przykładzie z AclEntry to wygląda po prostu jak uproszczony zapis setterów, co bardziej pasuje pod "chain invocation", o którym wspomniał Krzysiek.
Przykładowo zamiast ".setType(AclEntryType.ALLOW)" można by np. napisać ".withAllowType()". Nie znam tej klasy, więc nie wiem czy faktycznie by to miało sens - ale będzie to bardziej fluent niż kolejny setter.
Oczywiście trzeba uważać z przykładami, które są w sieci. Sama zamiana "set" na "with" fluent interface'u jeszcze nie czyni :)