스칼라의 컴패니언 객체와 정적 메소드의 장점은 무엇입니까?


50

스칼라는 정적 키워드가 없지만 컴패니언 객체를 통해 비슷한 기능을 수행합니다. 비하인드 컴패니언 오브젝트는 정적 메소드가있는 클래스로 컴파일되므로이 모든 것이 구문 설탕입니다. 이 디자인 선택의 장점은 무엇입니까? 단점? 다른 언어들도 비슷한 구성을 가지고 있습니까?


답변:


49

다음은 몇 가지 이유이며, 자신의 환경 설정에 따라 다소 매력적일 수 있습니다.

  1. 단순히 "구문 설탕"으로 할인하지 마십시오. 무언가가 단지 구문 설탕 이라고 말할 수도 있지만 , 커피 또는 차 마시는 사람뿐만 아니라 프로그래머로서 인생을 달콤하게 만드는 것은 모든 설탕에 달려 있습니다.

  2. 싱글 톤-모든 스칼라 object는 본질적으로 싱글 톤입니다. Java 세계에서 사람들은 모든 종류의 다른 방식으로 싱글 톤을 구현하고 있으며 구현에서 실수를 저 지르지 않는 경우가 많으므로 Scala에서와 같이 간단한 오류를 만들 수 없습니다. object대신 쓰는 것이 class싱글 톤이되고 끝났습니다.

  3. 정적 메소드에 액세스 : Java의 정적 메소드는 오브젝트에서 액세스 할 수 있습니다. 예를 들어, C정적 메서드 fc유형 의 객체 가있는 클래스가 있다고 가정합니다 C. 그런 다음을 호출 해야C.f 하지만 Java는 (경고는 있지만) 사용하도록 허용합니다 c.f. 스칼라 배경에서 올 때 객체에는 f실제로 메소드가 없기 때문에 실제로 의미가 없습니다 .

  4. 명확한 분리 : Java에서는 클래스에서 정적 속성과 비 정적 속성 및 메서드를 혼합 할 수 있습니다. 훈련을 받아도 문제가되지는 않지만, 귀하 (또는 그 문제의 다른 사람)가 그렇지 않으면 정적 부품과 비 정적 부품이 끼워 져서 한 눈에 말하기가 어렵습니다. 정적 인 것과 그렇지 않은 것. 스칼라에서 컴패니언 객체 안에있는 모든 것은 해당 클래스의 런타임 객체의 일부가 아니라 정적 컨텍스트에서 사용할 수 있습니다. 반대로 클래스 내부에 작성된 경우 해당 클래스의 인스턴스에서는 사용할 수 있지만 정적 컨텍스트에서는 사용할 수 없습니다. 정적 및 비 정적 초기화 블록을 클래스에 추가하기 시작하면 Java에서 특히 부담이됩니다. 이것은 동적 실행 순서의 관점에서 이해하기가 매우 어려울 수 있습니다.

  5. 적은 코드 :의 모든 속성 또는 메소드에 정적 단어를 추가 할 필요가 없으므로 object코드를 더 간결하게 유지할 수 있습니다 (실제로 눈에 띄는 이점은 아님).

단점은 찾기가 훨씬 어렵습니다. 정적 부분과 비 정적 부분이 함께 속해 있어야하지만 스칼라 개념의 컴패니언 객체로 분리되어 있다고 주장 할 수 있습니다. 예를 들어, 클래스 다이어그램을 갖는 것이 이상하게 보일 수 있지만 코드에서 두 가지를 작성하고 어떤 속성이 어디로 갈지 결정해야합니다.


1
또한 정적은 순수한 OOP 소프트웨어에 속하지 않습니다. 정적 행동이 필요할 때, 자신의 클래스를 사용하고 그것의 하나의 (단일) 객체를 만들어 다른 클래스의 객체의 (잠재적으로) 정적 행동을 관리합니다.
K ..

1
"클래스 대신 객체를 작성하면 싱글 톤이되고 완료됩니다." 나는 Singletons를별로 신경 쓰지 않지만이 특정 "구문 설탕"의 직접성이 특정 매력을 가지고 있음을 인정해야합니다.
Ed Hastings

3
1에서 5까지의 포인트 (모두도 함께)는 구현시 진정한 컴패니언 객체가 필요하지 않습니다. 이들 모두는 런타임에 영향을 미치지 않으면 서 순수한 구문 설탕으로 쉽게 만들 수 있습니다. 유일한 진짜 이유는 런타임 동반자 객체가 알렉세이 로마노프의 대답에 나와 있습니다합니다.
mas.morozov 2016 년

"단점을 찾기가 훨씬 어렵다." 공연? 객체 메소드에 액세스하면 ifnonnull단순히와 비교하여 바이트 바이트가 생성됩니다 invokeStatic.
Eduardo Pareja Tobes

33

또 다른 이점은 object정적 메소드와 달리 인터페이스 / 특성을 구현할 수 있다는 것입니다 .


8
이것이 동반자 객체와 정적 메서드가있는 클래스 주요 차이점 이라고 생각 합니다. 컴패니언 객체는 다형성이며 인터페이스 / 특성을 기대하는 메소드의 인수로 전달 될 수 있습니다.
dcastro

4

Companion 객체는 가장 먼저 암시 적을 검색 한 후 scala가 Predef를보고 해당 소스 파일의 명시적인 "가져 오기"문을 찾습니다.

Java 언어 또는 라이브러리가 비슷한 메커니즘을 제공하는지 여부를 알기에는 Java 개발자가 충분하지 않습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.