복붙노트

[SCALA] 스칼라의 동반자 객체를 가진 뒤에있는 근거는 무엇입니까?

SCALA

스칼라의 동반자 객체를 가진 뒤에있는 근거는 무엇입니까?

클래스의 동반자 개체 (싱글)을 필요로하는 경우가 있습니까? 내가 클래스를 만들려는 이유, 푸는 또한 그것을위한 동반자 개체를 만들라고?

해결법

  1. ==============================

    1.컴패니언 오브젝트는 기본적으로 하나의 "정적 같은"방법을 넣을 수있는 장소를 제공합니다. 또한, 동반자 객체 또는 동반자 모듈은 개인 포함한 클래스 멤버에 대한 전체 액세스 할 수 있습니다.

    컴패니언 오브젝트는 기본적으로 하나의 "정적 같은"방법을 넣을 수있는 장소를 제공합니다. 또한, 동반자 객체 또는 동반자 모듈은 개인 포함한 클래스 멤버에 대한 전체 액세스 할 수 있습니다.

    도우미 개체는 공장 방법 같은 것들을 캡슐화를 위해 중대하다. 대신해야하는 데, 예를 들어, 푸 사방 FooFactory, 당신은 동반자 객체와 클래스가 공장 책임에 걸릴 수 있습니다.

  2. ==============================

    2.도우미 객체는 상태와 클래스의 모든 인스턴스에 공통적 인 방법을 저장하는 데 유용하지만 그들은 정적 메소드 또는 필드를 사용하지 않습니다. 그들은 상속을 통해 대체 될 수 있습니다 일반 가상 방법을 사용합니다. 스칼라는 정말 정적 아무 상관이 없습니다. 이 당신이 사용할 수있는 많은 방법이있다 그러나 여기에 간단한 예입니다.

    도우미 객체는 상태와 클래스의 모든 인스턴스에 공통적 인 방법을 저장하는 데 유용하지만 그들은 정적 메소드 또는 필드를 사용하지 않습니다. 그들은 상속을 통해 대체 될 수 있습니다 일반 가상 방법을 사용합니다. 스칼라는 정말 정적 아무 상관이 없습니다. 이 당신이 사용할 수있는 많은 방법이있다 그러나 여기에 간단한 예입니다.

    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
    
  3. ==============================

    3.... 그것은 정적 팩토리 메소드를 저장하기에 좋은 장소 (안 그 DP)과 함께 클래스. 당신이 그 과부하 공장의 이름을 경우 방법은 당신이 / 만들려면 클래스를 초기화 할 수 있습니다 (/.../) 적용

    ... 그것은 정적 팩토리 메소드를 저장하기에 좋은 장소 (안 그 DP)과 함께 클래스. 당신이 그 과부하 공장의 이름을 경우 방법은 당신이 / 만들려면 클래스를 초기화 할 수 있습니다 (/.../) 적용

    예제 코드 :

    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를 호출 할 것이다 : 뭔가 추상적를 만드는처럼. 그 이름에게 진정한 의미를 부여합니다. 불변, 이하에있어서, 케이스의 클래스를 사용하는 것을 고려하고 추상베이스 클래스를 밀봉.

  4. ==============================

    4.SAEM 그의 대답에서 말했다 것들 외에도, 스칼라 컴파일러는 (소스 또는 대상 중 하나의) 대응하는 동반자 객체의 종류의 암시 적 변환을 찾습니다 때문에 전환은 수입 할 필요가 없습니다.

    SAEM 그의 대답에서 말했다 것들 외에도, 스칼라 컴파일러는 (소스 또는 대상 중 하나의) 대응하는 동반자 객체의 종류의 암시 적 변환을 찾습니다 때문에 전환은 수입 할 필요가 없습니다.

    스칼라 일반 프로그래밍 말합니다에서 단일 개체에 대한 이유에 관하여 :

  5. ==============================

    5.나는 항상 동반자가 모두 기능을 작성하고 스칼라 지향 코드를 객체에 다리 객체를 참조하십시오. 여러 번 우리는 그냥 입력을하고, 처리 결과를 제공하는 순수 기능이 필요합니다. 동반자 객체에 그 관련 기능을 넣는 것은 쉽게 찾아 내 코드의 상단에 약간의 한 건물뿐만 아니라 자신을 위해 사용할 수 있습니다.

    나는 항상 동반자가 모두 기능을 작성하고 스칼라 지향 코드를 객체에 다리 객체를 참조하십시오. 여러 번 우리는 그냥 입력을하고, 처리 결과를 제공하는 순수 기능이 필요합니다. 동반자 객체에 그 관련 기능을 넣는 것은 쉽게 찾아 내 코드의 상단에 약간의 한 건물뿐만 아니라 자신을 위해 사용할 수 있습니다.

    또한, 그것은 아무것도하지 않고 싱글 톤 패턴을 작성하는 언어로 제공되는 기능입니다. 당신은 JVM의 수명에 대한 위임자를 캡슐화 싱글을 필요로 할 때 특히 유용합니다. 예를 들어, 당신은 기본 Java 구현을 기반으로 위임자를 캡슐화하고 API의 소비자는 순수한 세계에 살고하도록 할 수 있습니다 스칼라에서 간단한 HTTP 클라이언트 라이브러리를 작성.

  6. ==============================

    6.당신은 같은 이름으로 같은 파일에 클래스와 객체를 정의하면, 그들은 동반자 클래스와 개체로 알려져 있습니다. 스칼라 당신은 스칼라의 동반자 클래스와 객체와 정적의 대체 취할 수, JAVA 키워드 정적이 없습니다.

    당신은 같은 이름으로 같은 파일에 클래스와 객체를 정의하면, 그들은 동반자 클래스와 개체로 알려져 있습니다. 스칼라 당신은 스칼라의 동반자 클래스와 객체와 정적의 대체 취할 수, JAVA 키워드 정적이 없습니다.

    더 상세한 내용은 기술 자료 문서를 확인하세요 스칼라 프로그래밍에서 클래스와 객체 키워드

  7. ==============================

    7.처음에는 싱글 톤 클래스를 제작하는 간단한 방법을 제공 methods.Also 비 정적 메서드 대 정적의 명확한 분리를 제공합니다.

    처음에는 싱글 톤 클래스를 제작하는 간단한 방법을 제공 methods.Also 비 정적 메서드 대 정적의 명확한 분리를 제공합니다.

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

  8. from https://stackoverflow.com/questions/609744/what-is-the-rationale-behind-having-companion-objects-in-scala by cc-by-sa and MIT license