Paths.get vs Path.of

20

O ile mogę powiedzieć Paths.geti Path.ofwydaje się, że robię dokładnie to samo, zamieniając jeden lub więcej ciągów w Pathobiekt; dokumentacja https://docs.oracle.com/javase/8/docs/api/java/nio/file/Paths.html#get-java.lang.String-java.lang.String...- i https: //docs.oracle.com/en/java/javase/13/docs/api/java.base/java/nio/file/Path.html#of(java.lang.String,java.lang.String ... ) użyj tego samego sformułowania. Czy w rzeczywistości są identyczne?

Path.ofzostał wprowadzony później. Domysł: został wprowadzony ze względu na spójny Foo.ofstyl. Czy w takim przypadku byłoby to preferowane ze względu na spójność / względy estetyczne?

rwallace
źródło
5
Myślę że masz rację. Szybko przeszukałem listy dyskusyjne Java: mail.openjdk.java.net/pipermail/nio-dev/2018-March/004810.html Wciąż czytam, aby napisać odpowiedź.
Johannes Kuhn
2
Wolę, Path.ofponieważ nie wymaga dodatkowego importu
ZhekaKozlov

Odpowiedzi:

22

Rzeczywiście, Path.ofzostał później wprowadzony.

Domysł: został wprowadzony ze względu na spójny Foo.ofstyl.

Z archiwum listy mailingowej ta metoda została kiedyś wywołanaPath.get :

Główne zmiany dotyczą ścieżki i ścieżek w pliku java.nio.file.

Ta poprawka kopiuje metody Paths.get () do metod statycznych w Path.get () i modyfikuje te pierwsze, aby wywoływały te drugie odpowiednie metody. Specyfikacja Ścieżki została nieco oczyszczona, aby nie odnosiła się do Ścieżek ani do samej siebie, np. „(Patrz Ścieżka)”. Adnotacje @implSpec są dodawane do ścieżek, aby wskazać, że metody po prostu wywołują swoje odpowiedniki w ścieżce.
...

Zostało to później zmienione, gdy Brian Goetz zasugerował, że jest spójny zFoo.of :

Osobno Brian Goetz zasugerował poza listą, że byłoby bardziej spójne, gdyby te metody fabryczne zostały nazwane „z”, więc zakładam, że webrev zostanie zaktualizowany, aby zobaczyć, jak to wygląda.

A teraz ostatnie pytanie: „Czy w takim przypadku byłoby to preferowane ze względu na spójność / względy estetyczne?”
W pierwszej wiadomości Brian Burkhalter powiedział, że zaktualizował wszystkie odniesienia do nowej metody w Path:

Wszystkie pliki źródłowe w java.base są modyfikowane, aby zmienić Paths.get () na Path.get () i usunąć import dla Paths. ...

W związku z tym Path.ofdoszłbym do wniosku, że rzeczywiście jest to lepsze niż Paths.get.
Rzeczywiście, jeśli spojrzysz na Javadoc for Pathsfor Java 13 , znajdziesz następującą notatkę:

Uwaga API :
Zaleca się uzyskanie za Pathpomocą Path.ofmetod zamiast getmetod zdefiniowanych w tej klasie, ponieważ klasa ta może być przestarzała w przyszłej wersji.

Johannes Kuhn
źródło
5
Pamiętaj, że NIO.2 został wprowadzony w Javie 7, gdy metody statyczne w interfejsach nie były możliwe. Dlatego potrzebne klasę towarzysz, Paths. Zastosowanie fabrycznej metody interfejsu zmniejsza liczbę typów, z którymi musi sobie radzić kod. Styl nazewnictwa to kolejny punkt, który został zmieniony, ponieważ istniała taka możliwość.
Holger