Pergunta

Existe um caso em que é necessário um objeto companheiro (Singleton) para uma classe? Por que eu iria querer criar uma classe, Foo exemplo e também criar um objeto companheiro para ele?

Foi útil?

Solução

O objeto companheiro basicamente fornece um lugar onde se pode colocar "static-like" métodos. Além disso, um objeto companheiro, ou módulo companheiro, tem acesso total aos membros da classe, incluindo os privados.

objetos do companheiro são grandes para encapsular coisas como métodos de fábrica. Em vez de ter que ter, por exemplo, Foo e FooFactory em todos os lugares, você pode ter uma classe com um companheiro objeto assumir as responsabilidades de fábrica.

Outras dicas

objetos do companheiro são úteis para armazenar estado e métodos que são comuns a todas as instâncias de uma classe , mas eles não usam estática métodos ou campos. Eles usam métodos virtuais regulares que podem ser substituídas por herança. Scala realmente não tem nada estático. Há muitas maneiras que você pode usar isto, mas aqui está um exemplo simples.

abstract class AnimalCounter
{
    var animals = 0

    def name: String

    def count()
    {
        animals += 1
        println("%d %ss created so far".format(animals, name))
    }
}

abstract class Animal
{
    def companion: AnimalCounter
    companion.count()
}

object Dog extends AnimalCounter
{
    val name = "dog"
}

class Dog extends Animal
{
    def companion = Dog
}

object Cat extends AnimalCounter
{
    val name = "cat"
}

class Cat extends Animal
{
    def companion = Cat
}

Que produz esta saída:

scala> new Dog
1 dogs created so far

scala> new Cat
1 cats created so far

scala> new Dog
2 dogs created so far

scala> new Cat
2 cats created so far

... e é um bom lugar para armazenar métodos de fábrica estáticos (não que DP) para as classes acompanhada. Se você nomear esses métodos de fábrica sobrecarregados aplicar (/ ... /), você vai ser capaz de criar / inicializar você classe

  1. sem 'novo' (que não é realmente importante)

  2. com diferentes conjuntos possíveis de parâmetros (comparar com o que Bloch escreve em Java eficaz sobre construtor telescópica)

  3. com a capacidade de decidir qual derivado classe que você deseja criar, em vez do resumo (acompanhado) um

código Exemplo:

abstract class AbstractClass;
class RealThing(s: String) extends AbstractClass;
class AlternativeThing(i: Int) extends AbstractClass;
object AbstractClass {
  def apply(s: String) = {
    new RealThing(s)
  }
  def apply(i: Int) = {
    new AlternativeThing(i)
  }
}

// somewhere else you can
val vs = AbstractClass("asdf")  // gives you the RealThing wrapped over string
val vi = AbstractClass(123)  // gives you AlternativeThing wrapped over int

Eu não chamaria a classe de objeto / base AbstractXxxxx porque não parece ruim: como a criação de algo abstrato. Dar esses nomes um significado real. Considere o uso de imutável, método menos, aulas de caso e selar a classe base abstrata.

Além das coisas Saem disse em sua resposta , o compilador Scala também procura conversões implícitas de tipos em objetos companheiro correspondentes (de origem ou o destino), para que as conversões não precisa ser importado.

Sobre a razão para singleton objetos em em Scala diz:

Como mencionado no Capítulo 1, uma maneira em que Scala é mais-orientado a objeto de Java é que as classes em Scala não pode ter membros estáticos. Em vez disso, Scala tem objetos Singleton (p. 65).

Eu sempre ver objetos de companhia como um bridge para escrever tanto código funcional e orientada a objetos em Scala. Muitas vezes só precisamos de funções puras que têm alguma entrada e apresentará um resultado de processamento. Colocar essas funções relevantes no objeto companheiro facilita a olhar para cima e usar, para mim, assim como algum edifício um em cima do meu código.

Além disso, é um recurso de linguagem fornecido para escrever o padrão Singleton sem fazer nada. Isto é especialmente útil quando você precisa de um singleton para encapsular um delegante para a vida da JVM. Por exemplo, escrevendo uma biblioteca cliente HTTP simples em Scala, onde pode encapsular um subjacente delegante baseada aplicação Java e permitir que os consumidores da sua API ao vivo no mundo puro.

Se você definir classe e objeto no mesmo arquivo com o mesmo nome, eles conhecido como classe companheiro e objeto. Scala não tem estática, como JAVA palavra-chave, você pode tomar como substituição de estática com classe companheiro e objeto no Scala.

Para informações mais detalhadas consulte o artigo classe e palavra-chave objeto na programação scala

Em primeiro lugar, ele fornece uma clara separação de estática vs métodos estáticos não methods.Also fornecem uma maneira simples de criar única classe.

Ele também pode herdar métodos de outras classes e / ou características, que não pode ser feito com methods.and estática Java pode ser passado como um parâmetro.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top