Groovy에서 @Mixin 주석을 사용하고 싶습니다.이 메소드는 내가 원하는 것만 빼고는 원하는 방식으로 처리합니다. 또한 private 메소드와 필드를 혼합합니다.Groovy @Mixin에 대한 솔루션 찾기. 캡슐화를 중단하지 마십시오.
class A {
def private fooA() {
println("A")
}
}
@Mixin(A)
class B {
def fooB() {
println("B")
}
}
지금이 코드
static main(args)
{
def b = new B()
println(b.fooA())
B.metaClass.fooA = {throw new MissingMethodException()};
println(b.fooA())
}
그것은 먼저 개인 방법 A.fooA 및 인쇄 "A"를 호출을 실행합니다. 그런 다음 private 메소드가 제거되고 클래스 A에서 혼합 된 클라이언트 클래스 B가 호출 할 수 없습니다. 처음부터 일을하고 싶습니다.
지금 제 질문은 일반적인 방법으로 어떻게 할 수 있습니까? @Mixin 주석을 확장 할 수 있습니다. 문제는 Groovy에 익숙하지 않아 AST 변환을 작성하는 방법을 찾는 데 많은 정보가 없다는 것입니다. 그것에 대한 전체 장을 가진 새로운 Groovy in Action 서적은 아직 나오지 않았습니다.
대신 @Delegate를 사용할 수 있지만 위임 된 클래스의 변수를 선언해야합니다. 이것은 내가 원하는 것이 아닙니다. 나는 단지 내 물건을 사용하여 개발자에게 @Mixin을 사용하여 자신의 수업에 주석을 달아서 내 재료에 혼합 할 수 있다고 말하면 좋을 것입니다. 그리고 내 클래스의 private 메소드와 필드는 클래스의 내부 코드를 깨뜨린 사용자가 호출 할 수 없다는 것을 확신 할 수 있습니다.
누구에게 어떤 방향으로 시도해야합니까? 고마워, 올리버
안녕하세요 Brian, 답변 해 주셔서 감사합니다. 글쎄, 자동 완성 선택 목록이 "f"를 입력 한 후 IDE (IDEA를 사용)에서 팝업 될 때. private 메소드 fooA는 선택 가능한 옵션으로 나열되지 않습니다 (그러나 fooB는 선택 사항입니다). B의 인스턴스에서 여전히 fooA를 호출하는 개발자는 이전에 일종의 경고를 받았습니다. 아마 충분하다. 결국, 나는 이전의 "모든 유형의 안전"세계에 너무 많이 익숙하지 않다 ;-). – OlliP