Os getters e setters ES6 têm uma motivação substancialmente diferente de conceitos semelhantes em Java.
Em Java, getters e setters permitem que uma classe defina um JavaBean. O objetivo dos getters e setters é que eles permitem que o bean tenha uma "interface" completamente ortogonal daquela implícita nos campos públicos. Portanto, posso ter um campo "nome" que NÃO é uma propriedade JavaBean e posso ter um "endereço" de propriedade JavaBean que NÃO é um campo.
As propriedades JavaBean também são "detectáveis" por milhares de estruturas (Hibernate, por exemplo) por meio de reflexão Java. Portanto, getters e setters fazem parte de um método padrão para "expor" as propriedades do bean.
Getters e setters, sendo funções, também têm o valor de "abstrair" a implementação. Pode ser um campo ou um valor calculado ("sintético"). Portanto, se eu tiver uma propriedade de bean chamada "zipcode", ela começa como string armazenada. Agora, suponha que eu queira alterá-lo para um valor calculado de endereço / cidade / estado.
Se eu usar um campo, este código será quebrado:
String zipcode = address.zipcode();
Mas se eu usar um getter, isso não quebra:
String zipcode = address.getZipcode();
JavaScript não tem nada como JavaBeans. Até onde eu li, o valor pretendido de GET e SET é limitado às propriedades "sintéticas" (calculadas) mencionadas anteriormente.
Mas é um pouco melhor do que o java porque, embora o Java não permita que você converta de forma compatível um "campo" em um método, o ES6 GET e SET permitem isso.
Ou seja, se eu tiver:
var zipcode = address.zipcode;
Se eu alterar o CEP de uma propriedade de objeto padrão para um getter, o código acima agora chama a função GET.
Observe que, se eu não incluísse GET na definição, isso NÃO invocaria o método GET do código postal. Em vez disso, ele simplesmente atribuiria o código postal da função ao var.
Portanto, acho que essas são algumas distinções importantes para entender entre getters e setters Java e JavaScript ES6.