Quais são as vantagens dos objetos complementares do Scala versus métodos estáticos?


50

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?


Respostas:


49

Aqui estão alguns motivos, que podem ser mais ou menos atraentes para você, dependendo de suas próprias preferências:

  1. 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á.

  2. 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. Escrevendo objectem vez classdo torna um singleton e está feito.

  3. 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 Ccom um método estático fe um objeto cdo tipo C. Então você deve ligar C.f, mas o Java permite que você (embora com um aviso) use c.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étodo frealmente.

  4. 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.

  5. 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.


11
Também li que a estática não pertence a um software puro de POO. Por exemplo, quando você precisar de comportamento estático, use uma classe própria e crie um objeto (singleton), que gerencia o comportamento (potencialmente) estático dos objetos de outra classe.
K ..

11
"Escrever um objeto em vez de classe o torna um singleton e pronto." Eu não me importo muito com Singletons, mas devo admitir que a franqueza desse "açúcar sintático" específico tem um certo encanto.
Ed Hastings

3
Nenhum dos pontos de 1 a 5 (e até todos eles juntos) precisa de um verdadeiro objeto complementar em tempo de execução para ser implementado. Todos eles poderiam ser facilmente transformados em açúcar sintático puro, com impacto zero no tempo de execução. A única razão real para ter um objeto complementar em tempo de execução é dada na resposta de Alexey Romanov.
mas.morozov

"As desvantagens são muito mais difíceis de encontrar." Atuação? acessar um método de objeto gera ifnonnulletc bytecode, comparado simplesmente invokeStatic.
Eduardo Pareja Tobes

33

Mais um benefício é que objects podem implementar interfaces / características, diferentemente dos métodos estáticos.


8
Eu acho que essa é a principal diferença entre um objeto complementar e uma classe com métodos estáticos. Um objeto complementar é polimórfico e pode ser passado como argumento para métodos que esperam uma interface / característica.
Dcastro

4

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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.