O Scala não possui uma palavra-chave estática , mas possui uma funcionalidade semelhante por meio de objetos complementares. Nos bastidores, os objetos complementares são compilados para classes que têm métodos estáticos, então tudo isso é açúcar sintático. Quais são as vantagens desta opção de design? Desvantagens? Outras linguagens têm construções semelhantes?
50
Respostas:
Aqui estão alguns motivos, que podem ser mais ou menos atraentes para você, dependendo de suas próprias preferências:
Não basta descontá-lo por ser "açúcar sintático". Embora você possa dizer que algo é apenas açúcar sintático, é o açúcar que adoça sua vida - como programador e bebedor de café ou chá.
Singletons - todo Scala
object
é inerentemente um singleton. Considerando que no mundo Java as pessoas estão implementando singletons de todos os tipos e de maneira mais frequente, acabam cometendo algum erro em sua implementação, não é possível cometer um erro tão simples como o do Scala. Escrevendoobject
em vezclass
do torna um singleton e está feito.Acesso a métodos estáticos: Os métodos estáticos em Java podem ser acessados a partir de objetos. Por exemplo, suponha que você tenha uma classe
C
com um método estáticof
e um objetoc
do tipoC
. Então você deve ligarC.f
, mas o Java permite que você (embora com um aviso) usec.f
, o que, quando você vem do plano de fundo do Scala, não faz muito sentido, porque os objetos não têm um métodof
realmente.Separação clara: em Java, você pode misturar atributos e métodos estáticos e não estáticos em uma classe. Se você trabalha disciplinado, isso não se torna um problema; no entanto, se você (ou outra pessoa) não o faz, você acaba com as partes estáticas e não estáticas intercaladas e é difícil dizer rapidamente. o que é estático e o que não é. No Scala, tudo o que está localizado dentro do objeto complementar claramente não faz parte dos objetos de tempo de execução da classe correspondente, mas está disponível em um contexto estático. Vice-versa, se estiver escrito dentro de uma classe, estará disponível para instâncias dessa classe, mas não de um contexto estático. Isso se torna especialmente oneroso em Java, quando você começa a adicionar blocos inicializadores estáticos e não estáticos à sua classe. Isso pode acabar sendo muito difícil de entender em termos de ordem de execução dinâmica.
Menos código: você não precisa adicionar a palavra estática a todos os atributos ou métodos em um
object
, mantendo assim o código mais conciso (na verdade, não é realmente uma vantagem importante).As desvantagens são muito mais difíceis de encontrar. Pode-se argumentar que as partes estáticas e não estáticas devem pertencer juntas, mas são separadas pelo conceito Scala de objetos complementares. Por exemplo, pode parecer estranho ter um diagrama de classes, mas depois é necessário criar duas coisas no código e dissecar qual atributo vai para onde.
fonte
ifnonnull
etc bytecode, comparado simplesmenteinvokeStatic
.Mais um benefício é que
object
s podem implementar interfaces / características, diferentemente dos métodos estáticos.fonte
Os objetos complementares são o primeiro local pesquisado para implícitos; depois disso, o scala examina o Predef e, em seguida, as instruções "import" explícitas nesse arquivo de origem específico.
Eu não sou um desenvolvedor java suficiente para saber se a linguagem ou bibliotecas java fornecem algum mecanismo comparável.
fonte