#java #oop #java.util.scanner
#java #ооп #java.util.scanner
Вопрос:
Пока я смотрел видео на YouTube о том, как отделить UserInterface от логики программы, парень на видео передал объект класса scanner в качестве параметра конструктору класса UserInterface из метода main. Вот так:
public class UserInterface {
TodoList list;
Scanner input;
UserInterface(TodoList list,Scanner input){
this.list=list;
this.input=input;
}
}
Мой вопрос в том, почему он не создал объект класса Scanner в классе UserInterface вместо передачи объекта Scanner в качестве параметра из основного класса.
Ответ №1:
Поскольку Scanner является ресурсом. Это действительно странный ресурс; обычно ресурсы предназначены для мимолетного ресурса (например, идея состоит в том, чтобы перестать нуждаться в этом ресурсе задолго до полного завершения работы приложения), и один из целого класса (например, вы можете открыть 1 файл или миллион. Понятие «файл» — это множество; у вас может быть много файлов). System.in это странно; Вы не хотите его закрывать, а он всегда только один.
Это делает его странным ресурсом.
Тем не менее, он один, и ресурсы лучше всего рассматривать как отдельные объекты. Вы не хотели бы создавать 2 отдельных средства чтения файлов одновременно. По той же причине вам не нужны 2 сканера. Сканеры могут (и делают!) кэшировать, поэтому, если вы вызываете, скажем, .hasNextInt()
один сканер, а затем вызываете .next()
другой, все становится странным, потому что сканер не был разработан для этого.
Позвольте мне попытаться выразить это так: System.in
является глобальной константой. Поэтому любой сканер, который потребляет System.in также должно быть, потому что оно указано как вещь, которая может кэшировать вещи.
Отдельно это также открывает дверь, позволяющую вашему UserInterface
классу работать с разными входными данными. Может быть, вы захотите когда-нибудь принимать входные данные из интернет-соединения или пакетного файла с набором команд в нем. Или, что еще проще, вы хотите написать автоматический тест.
Scanner
по своей сути не означает: «Из стандартного ввода». Вы можете создать сканер из многих вещей: файлов, сетевых подключений, жестко закодированных строк, чего угодно, на самом деле.