Good day.
There is an example from the chapter Interfaces - Interfaces as a means of adaptation:
//: interfaces/RandomWords.java // Реализация интерфейса для выполнения требований метода import java.nio.*; import java.util.*; public class RandomWords implements Readable { private static Random rand = new Random(47); private static final char[] capitals = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".toCharArray(); private static final char[] lowers = "abcdefghijklmnopqrstuvwxyz".toCharArray(); private static final char[] vowels = "aeiou".toCharArray(); private int count; public RandomWords(int count) { this.count = count; } public int read(CharBuffer cb) { if(count-- == 0) return -1; // Признак конца входных данных cb.append(capitals[rand.nextInt(capitals.length)]); for(int i = 0; i < 4; i++) { cb.append(vowels[rand.nextInt(vowels.length)]); cb.append(lowers[rand.nextInt(lowers.length)]); } cb.append(" "); return 10; // Количество присоединенных символов } public static void main(String[] args) { Scanner s = new Scanner(new RandomWords(10)); while(s.hasNext()) System.out.println(s.next()); } }
I can not understand why the read method runs, although it is not called anywhere.
The algorithm, as I understand it, is as follows:
A link to the Scanner object is created, a Scanner object is created, and a RandomWords object is created and passed to the constructor. Further, the magic for me is caused by the hasNext () of the Scanner object and it is not clear what happens next.
I worked with Scanner when an input or file was later transferred to the constructor. And there it was clear that this would be the following value. And further reading.
What happens in this case, can someone explain? I just don’t understand how it works and why the read method is called.