2014-06-19 2 views
2

This question Scala 컬렉션을 확장하는 방법은 this answer으로, 이는 Set이 아닌 SetProxy에서 확장되었습니다. 그러나 SetProxy은 (는) 사용 중단되었습니다. 설명서에 "(버전 2.11.0 이상) 사용 부족 및 컴파일러 수준 지원으로 인해 프록시가 지원되지 않습니다."프록시가 사용되지 않는 이유는 무엇입니까?

프록시가 사용되지 않고 컴파일러가 지원되지 않는 이유는 무엇입니까? 스칼라가 똑같은 일을 수행하는 데 더 좋은 기술을 제공합니까? 치명적인 결함이있는 것으로 밝혀 졌습니까?

답변

4

깨지기 쉽기 때문에 프록시 기능이 지원되지 않습니다. 프록시는 모든 호출을 다른 구현으로 다시 전달해야합니다. 그러나 Set 계층에 새 메서드를 추가하면 SetProxy에 추가하고 꼭 필요한 위치를 지정했는지 확인해야합니다.

사실 실제로 프록시가 제대로 작동하는지 확인하는 좋은 방법은 없습니다. 따라서 실제로 작동하지 않는 것처럼 보이지만 실제로는 더 이상 보이지 않는 것보다 기능을 보유하지 않는 것이 더 나은 선택이라는 결론이 내려졌습니다. 프록 싱에 대한 컴파일러 지원으로 강력한 프록시를 유지하기가 쉬울 수도 있지만 수동 방식만으로는 충분하지 않습니다.

+0

Yikes! 나는 프록시 클래스가 수동으로 유지된다는 것을 깨닫지 못했다. 나는 그들이 영리한 포워딩 메커니즘으로 일해야만한다고 생각했다. Scala는 프록시가 수행하는 작업을 수행 할 다른 방법을 제공합니까 (예 : http://stackoverflow.com/questions/24301098). 매크로, 아마도? –

+2

컬렉션을 확장하는 것은 쉬운 일이 아닙니다. 당신은 아마도 당신의 새로운 콜렉션에 map이 같은 타입의 콜렉션을 리턴하기를 원할 것입니다. 그러나 그것을 위해서 당신은 당신의 새로운 클래스 외에'CanBuildFrom'과 아마도'YourNewSetLike'를 필요로합니다. 프록 싱은 블랙 박스 매크로가 당신을 도울 수있는 것이 아니지만 다른 사람들은 할 수있을 것입니다. 컴파일러 플러그인은 갈 길이 멀지 만 콜렉션 계층은 자동 솔루션을 찾을 때 컴파일러가 정렬 할 수있는 것보다 더 많은 기능을 사용합니다. 나는 훌륭한 해결책이 있는지 확신하지 못합니다. –