见下面的程序,这个回调是怎么发生的啊?从程序中怎么看不出逻辑,都没有调用accept ()?
import java . io . File ;
import java . io . * ;
import java . util . * ;
import java . util . regex . * ;
public class DirList
{
public static void main (String [ ] args)
{
File path = new File (".") ;
String[ ] list ;
if ( args . length == 0 )
{
list = path . list ( ) ;
}
else
{
list = path . list (new DirFilter ( args [ 0 ])) ;
}
Arrays . sort (list , String . CASE_INSENSITIVE_ORDER );
for (String dirItem : list )
System . out . println (dirItem) ;
}
}
class DirFilter implements FilenameFilter
{
private Pattern pattern ;
public DirFilter ( String regex )
{
pattern = pattern . compile ( regex );
}
public boolean accept ( File dir , String name )
{
return pattern . matcher ( name ) . matches ( ) ;
}
}
간단히 말하면 필터를 목록에 추가할 때 필터에 정의된 조건을 사용하여 발생합니다
accept
메소드는file.list
클래스의 소스 코드를 열면 호출 과정을 명확하게 볼 수 있습니다. 아래는File
클래스에서 복사한File
메소드입니다.list
으아아아콜백의 의미는 인터페이스(반드시 인터페이스일 필요는 없음)를 구현하지만 이 인터페이스를 호출하지 않고 이 인터페이스(Java 클래스 라이브러리를 참조해야 함)를 정의하는 당사자가 사용자가 제공한 구현을 호출하도록 한다는 것입니다. .
요구 사항을 충족하는 하위 디렉터리를 나열하는 작업에는 여러 단계가 포함되며 그 중 일부는 변경되지 않습니다(예를 들어 먼저 현재 디렉터리의 모든 하위 디렉터리를 가져와야 합니다. 소스 코드는 본 적이 없지만 그래야 합니다. OS의 시스템 호출) 이는 Java 클래스 라이브러리에서 구현됩니다. 이 단계에 해당하는 것은 변경 작업, 즉 하위 디렉터리가 어떤 조건을 충족하기를 원하는지입니다. 따라서 클래스 라이브러리는 이 변경 부분을 사용자가 구현할 인터페이스로 설계한 다음
File.list()
을 통해 콜백을 등록합니다.전화가 안 오니까 콜백이라고 부르죠. 전화하지 마세요. 제가 다시 전화할게요
또는 보다 직접적으로
accept(File, String)
호출은File.list(FilenameFilter)
함수 내에서 발생합니다. 함수 내에서dir
및name
매개변수가 사용자가 제공한 구현에 전달됩니다. 즉,accept(File, String)
메서드가 호출됩니다.