JavaRush /Java Blog /Random-KO /클로저와 콜백. 조언이 필요합니다.
Konkistador
레벨 28

클로저와 콜백. 조언이 필요합니다.

Random-KO 그룹에 게시되었습니다
B. Eckel의 저서 "Closures and Callbacks" 주제에 대한 "Inner Classes" 장에는 다음 코드 예제가 나와 있습니다. //innerclasses/Callbacks.java // Использование внутренних классов // для реализации обратных вызовов package innerclasses; interface Incrementable { void increment(); } // ПРОСТО реализуем интерфейс: class Callee1 implements Incrementable { private int i = 0; public void increment() { i++; System.out.println(i); } } class MyIncrement { public void increment() { System.out.println("Другая операция"); } public static void f(MyIncrement mi) { mi.increment(); } } // Если ваш класс должен вызывать метод increment() // по-другому, необходимо использовать внутренний класс class Callee2 extends MyIncrement { private int i = 0; private void increment1() { super.increment(); i++; System.out.println(i); } private class Closure implements Incrementable { public void increment() { // Указывается метод внешнего класса, иначе // возникает бесконечная рекурсия: Callee2.this.increment1(); } } Incrementable getCallbackReference() { return new Closure(); } } class Caller { private Incrementable callBackReference; Caller(Incrementable cbh) { callBackReference = cbh; } void go() { callBackReference.increment(); } } public class Callbacks { public static void main(String[] args) { Callee1 c1 = new Callee1(); Callee2 c2 = new Callee2(); MyIncrement.f(c2); Caller caller1 = new Caller(c1); Caller caller2 = new Caller(c2.getCallbackReference()); caller1.go(); caller1.go(); caller2.go(); caller2.go(); } } 컴파일러는 Callee2 클래스의 increment() 메서드를 재정의할 수 없다고 보고합니다. 더 낮은 액세스 권한을 할당하려고 했습니다. 그리고 이는 이해할 수 있습니다. Java에서는 상속 중에 가시성을 높이는 방향으로만 액세스 수정자를 변경할 수 있습니다. 작가가 전달하고 싶었던 것이 무엇인지 말해 보세요. 여기서 오타가 어디에 있습니까?
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION