대답은 "스캐너에 상태가 있기 때문"입니다.
java.util.Scanner 의 코드를 보면 버퍼 및 관련 정보, Matcher, Pattern, 입력 소스, 소스가 닫혔는지 여부에 대한 정보, 유형과 같은 여러 개인 필드가 표시됩니다. 마지막 항목 일치, 마지막 항목이 유효한 일치 여부에 대한 정보, 숫자에 사용 된 기수, 로케일 (사용 .
하거나 ,
수천 구분 기호로 사용중인 경우에 대한 정보 ) 및 최근에 사용한 패턴에 대한 자체 LRU 캐시 , 마지막으로 발생한 예외에 대한 정보, 구문 분석 숫자에 대한 정보, 부울 구문 분석에 대한 정보, 정수 구문 분석에 대한 약간의 추가 정보 ... 그리고 그것에 대해 생각합니다.
보시다시피, 그것은 상당히 큰 텍스트 블록입니다. 이것이 스캐너의 상태입니다. 검사기를 정적 클래스로 만들려면 해당 상태를 다른 곳에 저장해야합니다. 그것을하는 C 방식에는 실제로 그렇게 많은 상태가 없습니다. 당신은 fscanf
있습니다. FILE은 현재 위치에 대한 상태를 유지합니다 (그러나 각 호출마다 전달되어야 함 fscanf
). 오류가 발생하면 처리해야합니다 (그리고 다음과 같은 코드 작성을 시작 하십시오 ). "정수를 기대했지만 문자열을 찾았습니다."와 같은 정보를 알려주지 않습니다.
이론적으로 정적 인 스캐너를 살펴보면 모든 상태가 클래스 외부에서 유지 관리되며 클래스 내에서 캡슐화되지 않습니다. 다른 코드의 비트는 이러한 변수에 영향을 줄 수 있습니다. 다른 코드가 클래스의 상태에 어설픈 경우, 주어진 상황에서 클래스가 무엇을할지 추론하기가 매우 어려워집니다.
아마도 다음과 같은 것을 작성하고 ScannerState { Locale loc; ... }
코드를 만들 수 있습니다.
ScannerState state = new ScannerState(a whole lot of arguments);
int foo = Scanner.nextInt(state);
그러나 이것은 상태가 처음에 스캐너 개체 내에 캡슐화되어있는 상태보다 훨씬 번거 롭습니다 (상태를 전달할 필요는 없음).
마지막으로, 스캐너는 다음 Iterator<String>
과 같은 코드에서 사용할 수 있는 인터페이스를 구현합니다 .
Scanner in = new Scanner(someFile);
whie(in.hasNext()) { ... }
Scanner 클래스의 인스턴스를 얻을 수 없으면이 유형의 구조는 객체 지향 언어 내에서 더 번거로워집니다.