Paths.get vs Path.of

20

Até onde eu sei, Paths.gete Path.ofpareço fazer exatamente a mesma coisa, transformando uma ou mais cordas em um Pathobjeto; a documentação https://docs.oracle.com/javase/8/docs/api/java/nio/file/Paths.html#get-java.lang.String-java.lang.String...- e https: //docs.oracle.com/en/java/javase/13/docs/api/java.base/java/nio/file/Path.html#of(java.lang.String,java.lang.String ... ) use a mesma redação. Eles são de fato idênticos?

Path.offoi introduzido mais tarde. Conjectura: foi introduzida em prol de um Foo.ofestilo consistente . Nesse caso, seria considerado preferível em termos de consistência / estética?

rwallace
fonte
5
Eu acho que você está correto. Uma rápida pesquisa nas listas de discussão sobre java trouxe isso: mail.openjdk.java.net/pipermail/nio-dev/2018-March/004810.html Ainda lendo para escrever uma resposta.
Johannes Kuhn
2
Prefiro Path.ofporque não requer importação adicional
ZhekaKozlov 22/01

Respostas:

22

De fato, Path.offoi introduzido mais tarde.

Conjectura: foi introduzida em prol de um Foo.ofestilo consistente .

No arquivo da lista de discussão, esse método já foi chamadoPath.get :

As principais alterações em estão em Path e Paths em java.nio.file.

Este patch copia os métodos Paths.get () para métodos estáticos em Path.get () e modifica o primeiro para chamar o último método respectivo. A especificação do caminho é ligeiramente limpa para não se referir aos caminhos nem a si mesma, por exemplo, “(consulte Caminho).” As anotações @implSpec são adicionadas aos Paths para indicar que os métodos simplesmente chamam suas contrapartes no Path.
...

Isso foi alterado mais tarde, quando Brian Goetz sugeriu que fosse consistente comFoo.of :

Separadamente, Brian Goetz sugeriu fora da lista que seria mais consistente se esses métodos de fábrica tivessem o nome "of", por isso presumo que o webrev será atualizado para ver como fica.

Agora, para sua última pergunta: "Nesse caso, seria considerado preferível em termos de consistência / estética?"
No correio inicial, Brian Burkhalter disse que atualizou todas as referências ao novo método em Path:

Todos os arquivos de origem em java.base são modificados para alterar Paths.get () para Path.get () e remover a importação de Paths. ...

Portanto, concluo que Path.ofé realmente preferível Paths.get.
De fato, se você olhar o Javadoc Pathspara Java 13 , encontrará esta nota:

Nota da API :
Recomenda-se obter uma Pathvia dos Path.ofmétodos em vez dos getmétodos definidos nesta classe, pois essa classe poderá ser preterida em uma versão futura.

Johannes Kuhn
fonte
5
Lembre-se de que o NIO.2 foi introduzido no Java 7 quando métodos estáticos nas interfaces não eram possíveis. Então, precisava de uma aula complementar Paths. O uso do método de fábrica da interface reduz o número de tipos, com o qual o código deve ser tratado. O estilo de nomeação é apenas outro ponto que foi revisado, pois havia essa oportunidade.
Holger