Aqui estão alguns motivos, que podem ser mais ou menos atraentes para você, dependendo das suas próprias preferências:
-
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é.
-
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. Escreverobject
em vez declass
faz com que seja um singleton e pronto. -
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 chamarC.f
, mas o Java permite que você (embora com um aviso) usec.f
, que quando você vem do background do Scala não faz sentido, porque os objetos não não tem um métodof
realmente. -
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.
-
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.