адаптируясь к интерфейсу - PullRequest
1 голос
/ 04 августа 2011

В разделе «Адаптация к интерфейсу», стр. 238 «Мышление в Java», автор представляет следующий пример

public class RandomDoubles {
    private static Random rand = new Random(47);
    public double next() { return  rand.nextDouble();}
    public static void main(string[] args){
    RandomDouble rd = new RandomDoubles();
    for (int i=0; i<7; i++)
        System.out.print(rd.next()+" ");
    }
}

В связи с этим примером автор заявляет

Предположим, у вас есть класс, который еще не реализует Readable (интерфейс) - как заставить его работать со Scanner (классом)?

Поскольку вы можете таким образом добавить интерфейс в любой существующий класс, это означает, что метод, который принимает интерфейс, обеспечивает возможность адаптации любого класса для работы с этим методом.Это сила использования интерфейсов вместо классов.

Однако я не совсем понимаю, как это утверждение отражено в примере.Например, где добавлен интерфейс?Что означает метод в «метод, который принимает интерфейс»?

Ответы [ 3 ]

3 голосов
/ 04 августа 2011

Я бы сказал, что данный текст не связан с предоставленным вами фрагментом кода.

Текст

В тексте описывается использование интерфейса (который, насколько я могу судить, не RandomDoubles), специально читаемый. Я не очень хорошо знаком с тем, как работает Сканер, так как недавно у меня не было Java.

Однако Сканер может принять объект Readable как параметр, из которого он затем читает. Это означает, что где-то в Scanner / read появляется код, подобный следующему.

Readable object = (parameter that is an object that implements Readable);

...
//in Scanner.read
object.read(buffer);

Этот объект Readable может быть одним из любых классов, реализующих Readable, либо собственным классом, либо FileReader, BufferedReader, InputStreamReader ...

Поскольку эти классы реализуют Readable и, следовательно, должны определять чтение (буфер), их можно использовать взаимозаменяемо в классе Scanner, ссылаясь на них как на объект этого типа интерфейса.

В тексте конкретно упоминается, что вы можете добавить эту функциональность в любой существующий класс, сделав его реализующим Readable, а затем определив, как его метод чтения (буфера) будет выводить символы в буфер.

Фрагмент кода

Прикрепленный фрагмент кода просто указывает, как пользовательский класс может использовать случайный объект, но только предоставляет возможность генерировать случайные двойные числа для любой программы, использующей этот класс. Это не связано с интерфейсами.

0 голосов
/ 14 марта 2013

В растворе,
заменить строку: cb.append(Double.toString(nextRandomNbr()));
с линией: cb.append(Double.toString(next()));

0 голосов
/ 22 февраля 2012
//Jim Colmenero - Application Architect - colmeneroj@videotron.ca

//It's been a while, but quite easy really.


import java.nio.CharBuffer;
import java.util.Random;
import java.util.Scanner;

public class RandomDoubles implements Readable{

    private static final long seed = 47;

    private static Random randomNbrGenerator = new Random(seed); 

    private int count;  // you just want 5 doubles printed 

    public RandomDoubles(int count) {  // ctor
        this.count = count;
    }

    public int read(CharBuffer cb) {
        if (count-- == 0)
            return -1; // Indicates end of input

        cb.append(Double.toString(randomNbrGenerator.nextDouble()));   
        cb.append(" ");
        return 0; // Number of characters appended- any positive value for this example
    }

    public static void main(String[] args) {

        Scanner scanner = new Scanner( new RandomDoubles(5) );

        while (scanner.hasNext()) { 
           System.out.println(scanner.next());  
        }
    }
}

// Output:

0.7271157860730044
0.5309454508634242
0.16020656493302599
0.18847866977771732
0.5166020801268457

Process finished with exit code 0

===================================================================================

Now, another way to answer the question, is NOT TO TOUCH the original code of the 
RandomDoubles  class, but instead add and execute an Adapter class like so:


import java.nio.CharBuffer;
import java.util.Scanner;

public class AdapterRandomDoubles
    extends RandomDoubles
    implements Readable {

    private int numberOfDoubleValues;

    public AdapterRandomDoubles(int numberOfDoubleValues) {      // ctor
        this.numberOfDoubleValues = numberOfDoubleValues;
    }
    public int read(CharBuffer cb) {
        if (numberOfDoubleValues-- == 0)
            return -1; // Indicates end of input

        cb.append(Double.toString(nextRandomNbr()));  
        cb.append(" ");
        return 0;
    }

    public static void main(String[] args) {
        Scanner scanner = new Scanner(new AdapterRandomDoubles(5)); // 5 random numbers
        while (scanner.hasNext())
            System.out.println(scanner.next());
    }
}

 ==== I guess that's it for now. So remember, debug to get the hang of it and have fun
 ==== like I do. 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...