2013-10-13 4 views
3

Этот вопрос носит чисто академический характер (я вхожу на Java, исходя из фона C#).Как я могу расширить класс java.util.Scanner для добавления метода nextChar()?

Мне интересно, как я могу расширить класс java.util.Scanner, чтобы добавить метод Scanner.nextChar().

(Пожалуйста, обратите внимание, что ответ не может быть специфическим для Scanner.nextChar(), но только об общих шагах, чтобы расширить родной класс. Очень высокая оценка.)

+1

По крайней мере, для конкретного случая это не так. Если вам действительно нужно читать по одному символу за раз, используйте вместо этого что-то вроде «BufferedReader». –

+1

Вы можете прочитать String со Scanner.read() и разбить строку на символы с помощью методов split: Scanner.read(). ToCharArray(). Возможно, это не то, что вы ищете, но это может дать тот же результат. – TAAPSogeking

+1

Сканер не является родным классом, в смысле Java. – EJP

ответ

2

Поскольку Scanner является final вы не можете объявить подкласс этого. Период.

  • Отражение не будет работать/помогать.
  • Байт-технические трюки не будут работать/помогать.

принципе, вы можете изменить Scanner класса, чтобы удалить модификатор final. Однако тот факт, что это класс, находится в одном из зарезервированных пакетов, означает, что вам потребуется изменить установку Java, чтобы это произошло. (Возможно, вы также сможете это сделать, изменив bootclasspath ... но это то же самое.)

Но, если честно, если нет необходимости изменять Scanner. Вместо этого вы можете просто скопировать исходный код Scanner (например, из базы данных OpenJDK) и использовать его для создания «несвязанного» класса в пространстве приложения вашего приложения с дополнительным методом. Это не будет по типу, связанным с реальным классом Scanner, но это вряд ли вызывает беспокойство.


Для записи:

  • Это Q & A - https://stackoverflow.com/a/18746676/139985 - обеспечивает некоторые возможные причины того, почему Scanner не поддерживает readChar. (Отмечая, конечно, что это явно «мнение».)

  • Наиболее вероятной причиной принятия окончательного решения Scanner является безопасность. A final Класс сканера означает, что экземпляр Scanner можно безопасно передать из ненадежного кода в доверенный код в изолированной среде.

3

Scanner является final классом, вы не можете продлить его. Если бы это был не финальный класс, вы можете просто расширить его. Как предложил Деннис, вы можете использовать метод BufferedReader#Read для чтения одного символа.

Возможно, расширились Reader и смоделировали BufferedReader?

1

Для эмулирования nextChar вы можете использовать next с пустым разделителем.

Scanner s = new Scanner("a\nb\tcd\re"); 
Pattern original = s.delimiter();// in case you wnat to get back to 
           // default delimiter 

s.useDelimiter(""); 

while (s.hasNext()) { 
    char c = s.next().charAt(0); 
    System.out.println("'" + c + "'"); 
} 

результат

'a' 
'  (here is printed value of `\n`) 
' 
'b' 
' ' (here is printed value of `\t`) 
'c' 
'd' 
'  (here is printed value of `\r`) 
' 
'e' 
Смежные вопросы