Помогите мне понять этот урок по реализации интерфейса - PullRequest
2 голосов
/ 09 февраля 2011

Я заинтересован в том, чтобы стать более свободным в Java, поэтому я изучил Sun / Oracle, учебник по Java . Я нахожусь в разделе реализации интерфейсов, и я не понимаю код, который они дали в качестве решения одного из упражнений.

Упражнение состояло в том, чтобы реализовать интерфейс java.lang.CharSequence, реализация должна вернуть строку назад и написать небольшой основной метод для тестирования вашего класса; Обязательно вызовите все четыре метода.

Это было немного ошеломляюще, поэтому я начал работать над их решением, чтобы понять, смогу ли я понять концепции и их код. Вот мои вопросы:

1) Когда они реализуют метод charAt, они возвращают вызов метода charAt, почему это не вызывает какой-то бесконечный цикл?

Заранее спасибо.

Вот код:

/* Copyright (c) 1995, 2008, Oracle and/or its affiliates. All rights reserved. */
// CharSequenceDemo presents a String value -- backwards.
public class CharSequenceDemo implements CharSequence {
    private String s;

    public CharSequenceDemo(String s) {
        //It would be much more efficient to just reverse the string
        //in the constructor. But a lot less fun!
        this.s = s;
    }

    //If the string is backwards, the end is the beginning!
    private int fromEnd(int i) {
        return s.length() - 1 - i;
    }

    public char charAt(int i) {
        if ((i < 0) || (i >= s.length())) {
        throw new StringIndexOutOfBoundsException(i);
        }
        return s.charAt(fromEnd(i));
    }

    public int length() {
        return s.length();
    }

    public CharSequence subSequence(int start, int end) {
        if (start < 0) {
        throw new StringIndexOutOfBoundsException(start);
        }
        if (end > s.length()) {
        throw new StringIndexOutOfBoundsException(end);
        }
        if (start > end) {
        throw new StringIndexOutOfBoundsException(start - end);
        }
        StringBuilder sub = 
        new StringBuilder(s.subSequence(fromEnd(end), fromEnd(start)));
        return sub.reverse();
    }

    public String toString() {
        StringBuilder s = new StringBuilder(this.s);
        return s.reverse().toString();
    }

    //Random int from 0 to max.
    private static int random(int max) {
        return (int) Math.round(Math.random() * max + 0.5);
    }

    public static void main(String[] args) {
        CharSequenceDemo s =
        new CharSequenceDemo("Write a class that implements the CharSequence interface found in the java.lang package.");

        //exercise charAt() and length()
        for (int i = 0; i < s.length(); i++) {
        System.out.println(s.charAt(i));
        }

        //exercise subSequence() and length();
        int start = random(s.length() - 1);
        int end = random(s.length() - 1 - start) + start;
        System.out.println(s.subSequence(start, end));

        //exercise toString();
        System.out.println(s);

    }
}

Ответы [ 3 ]

3 голосов
/ 09 февраля 2011

Вложенный вызов charAt - это s.charAt , что означает, что вы вызываете тот же метод, но для другого объекта.Там нет бесконечного цикла.

Их fromEnd определяется как

  private int fromEnd(int i) {
        return s.length() - 1 - i;
    }

почти наверху.

1 голос
/ 09 февраля 2011
  1. charAt на самом деле не является рекурсивным, он вызывает метод charAt класса String для String s.
  2. fromEnd(i) - это вызов метода fromEnd(int i), который также определен в вашем классе

-

//If the string is backwards, the end is the beginning!
    private int fromEnd(int i) {
        return s.length() - 1 - i;
    }
1 голос
/ 09 февраля 2011

1) Когда они реализуют устав метод, возвращаем вызов метода charAt, почему разве это не вызывает какой-то бесконечный цикл?

Не существует бесконечного цикла, потому что методы ссылаются на два совершенно разных объекта.

Интерфейс определяет charAt() подпись для CharSequence. Реализация в этом случае имеет вспомогательный экземпляр String. Реализация для CharSequence вызывает метод charAt() для резервного экземпляра String. Нет бесконечного цикла, потому что он не вызывает this.charAt().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...