문제

수업에 대한 동반자 개체 (싱글 톤)가 필요한 경우가 있습니까? 수업을 만들고 싶은 이유는 무엇입니까? Foo 또한 동반자 객체를 만드시겠습니까?

도움이 되었습니까?

해결책

동반자 객체는 기본적으로 "정적과 같은"방법을 넣을 수있는 장소를 제공합니다. 또한, 동반자 객체 또는 동반자 모듈은 개인 회원을 포함하여 클래스 멤버에 대한 전체 액세스 권한이 있습니다.

동반자 객체는 공장 방법과 같은 것들을 캡슐화하는 데 좋습니다. 예를 들어, Foo 그리고 FooFactory 어디에서나, 당신은 동반자 객체가 공장 책임에 대한 수업을 가질 수 있습니다.

다른 팁

동반자 개체는 클래스의 모든 인스턴스에 공통적 인 상태 및 메소드를 저장하는 데 유용합니다. 그러나 그들은 정적을 사용하지 않습니다 방법 또는 필드. 그들은 상속을 통해 무시할 수있는 일반 가상 방법을 사용합니다. 스칼라에는 진정으로 정적이 없습니다. 이것을 사용할 수있는 방법에는 여러 가지가 있지만 여기에는 간단한 예가 있습니다.

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
}

이 출력을 생성합니다.

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

... 그리고 수업을 위해 정적 공장 방법 (해당 DP가 아님)을 저장하기에 좋은 장소입니다. 오버로드 된 공장 방법의 이름을 지정하면 적용됩니다 (/.../) 클래스를 만들/초기화 할 수 있습니다.

  1. '새로운'없이 (실제로 그렇게 중요하지 않음)

  2. 가능한 매개 변수 세트 (Bloch가 텔레 스코핑 생성자에 대한 효과적인 Java에서 쓴 것과 비교)

  3. 초록 (동행) 대신 생성하려는 파생 클래스를 결정할 수있는 능력으로

예제 코드 :

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

나는 객체/기본 클래스 Abstractxxxxx를 호출하지 않을 것입니다. 그 이름들에게 진정한 의미를 부여하십시오. 불변, 방법이 적고 사례 클래스를 사용하고 추상 기본 클래스를 밀봉하는 것을 고려하십시오.

Saem이 말한 것 외에도 그의 대답, 스칼라 컴파일러도 찾고 있습니다 암시 적 전환 해당 동반자 객체의 유형 (소스 또는 대상)이므로 변환을 가져올 필요가 없습니다.

일반적으로 싱글 톤 개체의 이유에 대해 스칼라로 프로그래밍 말 :

1 장에서 언급했듯이 Scala가 Java보다 객체 지향적 인 한 가지 방법은 Scala의 클래스에 정적 멤버를 가질 수 없다는 것입니다. 대신, Scala에는 싱글 톤 객체가 있습니다 (p. 65).

나는 항상 동반자 객체를 a로 본다 다리 스칼라로 기능적 및 객체 지향 코드를 모두 작성합니다. 여러 번 우리는 입력을 취하고 처리 결과를 제공하는 순수한 기능 만 필요합니다. 관련 기능을 동반자 객체에 넣으면 내 코드 위에있는 하나의 건물뿐만 아니라 직접 조회하고 사용할 수 있습니다.

또한, 아무것도하지 않고 싱글 톤 패턴을 작성하는 것은 제공된 기능입니다. 이것은 JVM의 수명을위한 대표단을 캡슐화하기 위해 싱글 톤이 필요할 때 특히 유용합니다. 예를 들어, Scala에 간단한 HTTP 클라이언트 라이브러리를 작성하여 기본 Java 구현 기반 대표단을 캡슐화하고 API의 소비자가 Pure World에서 살도록 할 수 있습니다.

동일한 이름으로 클래스와 객체를 동일한 이름으로 정의하면 동반자 클래스와 객체로 알려져 있습니다. Scala는 정적 인 Java 키워드로 정적이 없으며 정적을 동반자 클래스로 교체하고 Scala의 객체를 대체 할 수 있습니다.

자세한 내용은 기사를 확인하십시오스칼라 프로그래밍의 클래스 및 객체 키워드

처음에는 정적 대 비 정적 메소드 방법을 명확하게 분리하여 싱글 톤 클래스를 만드는 간단한 방법을 제공합니다.

또한 Java 정적 방법으로 수행 할 수없는 다른 클래스 및/또는 특성에서 방법을 상속 할 수 있으며 매개 변수로 전달할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top