Existe um caso em que um objeto companheiro (singleton) para uma classe é necessário? Por que eu iria querer criar uma classe, digamos, Foo
e também criar um objeto companheiro para ela?
oop
scala
companion-object
Rahul
fonte
fonte
Respostas:
O objeto companheiro basicamente fornece um local onde se pode colocar métodos "do tipo estático". Além disso, um objeto companheiro, ou módulo companheiro, tem acesso total aos membros da classe, incluindo os particulares.
Os objetos companheiros são ótimos para encapsular coisas como métodos de fábrica. Em vez de ter que ter, por exemplo,
Foo
e emFooFactory
todos os lugares, você pode fazer com que uma classe com um objeto companheiro assuma as responsabilidades da fábrica.fonte
Os objetos complementares são úteis para armazenar estados e métodos comuns a todas as instâncias de uma classe, mas não usam métodos ou campos estáticos . Eles usam métodos virtuais regulares que podem ser substituídos por herança. Scala realmente não tem nada estático. Existem muitas maneiras de usar isso, mas aqui está um exemplo simples.
O que produz esta saída:
fonte
... e é um bom lugar para armazenar métodos de fábrica estáticos (não aquele DP) para classes acompanhadas. Se você nomear esses métodos de fábrica sobrecarregados como (/ ... /), você será capaz de criar / inicializar sua classe
sem 'novo' (não é tão importante)
com diferentes conjuntos de parâmetros possíveis (compare com o que Bloch escreve em Effective Java sobre construtor telescópico)
com a capacidade de decidir qual classe derivada você deseja criar em vez da abstrata (acompanhada)
Código de exemplo:
Eu não chamaria o objeto / classe base de AbstractXxxxx porque não parece ruim: como criar algo abstrato. Dê a esses nomes um significado real. Considere o uso de classes de caso imutáveis, sem método, e sele a classe base abstrata.
fonte
RealThing
e aAlternativeThing
classe deve ter umprivate
construtor para forçar o usuário a usar aAbstractClass
fábrica.class AlternativeThing private(i: Int) extends AbstractClass
Além das coisas que Saem disse em sua resposta , o compilador Scala também procura conversões implícitas de tipos nos objetos complementares correspondentes (da origem ou do destino), portanto, as conversões não precisam ser importadas.
Sobre a razão para objetos singleton em geral, a programação em Scala diz:
fonte
Sempre vejo os objetos complementares como uma ponte para escrever código funcional e orientado a objetos em Scala. Muitas vezes, precisamos apenas de funções puras que recebem alguma entrada e fornecem um resultado de processamento. Colocar essas funções relevantes no objeto complementar facilita a pesquisa e o uso, tanto para mim quanto para quem está construindo sobre meu código.
Além disso, é um recurso fornecido pela linguagem para escrever o padrão singleton sem fazer nada. Isso é especialmente útil quando você precisa de um singleton para encapsular um delegador para a vida da JVM. Por exemplo, escrever uma biblioteca cliente HTTP simples em Scala onde você pode encapsular um delegador baseado em implementação Java subjacente e permitir que os consumidores de sua API vivam em um mundo puro.
fonte
Se você definir classe e objeto no mesmo arquivo com o mesmo nome, eles são conhecidos como classe e objeto complementares. Scala não tem static como palavra-chave JAVA, você pode tomar como substituição de static com classe companion e objeto em Scala.
Para obter informações mais detalhadas, verifique a classe do artigo e a palavra-chave do objeto em programação scala
fonte
A princípio, ele fornece uma separação clara dos métodos de métodos estáticos e não estáticos. Também fornece uma maneira simples de criar uma classe de singleton.
Ele também pode herdar métodos de outras classes e / ou características, o que não pode ser feito com métodos estáticos Java e pode ser passado como um parâmetro.
fonte