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

48

O Scala não tem nenhum static -keyword, mas tem uma funcionalidade semelhante por meio de objetos complementares. Nos bastidores, os objetos complementares são compilados para classes que possuem métodos estáticos, portanto, tudo isso é um açúcar sintático. Quais são as vantagens desta escolha de design? Desvantagens? Outras linguagens têm construções similares?

    
por Zavior 14.12.2012 / 02:35
fonte

3 respostas

48

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

  1. Não o desconsidere simplesmente por ser "açúcar sintático". Embora você possa dizer que algo é apenas açúcar sintático, é afinal o açúcar que adoça sua vida - como programador tão bem quanto um bebedor de chá ou café.

  2. Singletons - todo Scala object é inerentemente um singleton. Considerando que no mundo Java as pessoas estão implementando singletons em todos os tipos de maneiras diferentes e, na maioria das vezes, acabam cometendo algum erro em sua implementação, você não pode cometer um erro tão simples como esse no Scala. Escrever object em vez de class faz com que seja um singleton e pronto.

  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 C com um método estático f e um objeto c do tipo C . Então você deve chamar C.f , mas o Java permite que você (embora com um aviso) use c.f , que quando você vem do background do Scala não faz sentido, porque os objetos não não tem um método f realmente.

  4. Limpar separação: 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, então você acaba com peças 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 pesado 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 compreender em termos de ordem de execução dinâmica. É muito mais claro no Scala, onde você inicializa o objeto associado de cima para baixo e, em seguida, faz o mesmo para a classe no caso de um objeto de tempo de execução ser criado.

  5. Menos código: você não precisa adicionar a palavra estática a cada atributo ou método em um object , mantendo assim o código mais conciso (na verdade, não é um vantagem proeminente realmente).

As desvantagens são muito mais difíceis de encontrar. Pode-se argumentar que as partes estáticas e não estáticas devem estar juntas, mas separadas pelo conceito Scala de objetos complementares. Por exemplo, pode parecer estranho ter um diagrama de classes, mas acabar tendo que criar duas coisas no código e dissecar qual atributo vai para onde.

    
por 14.12.2012 / 07:25
fonte
31

Mais uma vantagem é que object s pode implementar interfaces / características, ao contrário dos métodos estáticos.

    
por 14.12.2012 / 15:54
fonte
4

Os objetos complementares são o primeiro local pesquisado por implícitos, depois disso, o scala examina o Predef e, em seguida, as instruções explícitas de "importação" nesse arquivo de origem específico.

Eu não sou o suficiente de um java dev para saber se a linguagem java ou bibliotecas fornecem algum mecanismo comparável.

    
por 20.01.2013 / 16:39
fonte

Tags