возврат Java из частного метода в публичный - PullRequest
0 голосов
/ 29 сентября 2011

У меня есть публичный метод и приватный метод.они оба должны возвращать значения int.Закрытый метод - это тот, который выполняет всю работу, а публичный - тот, который вызывается из основной программы.Как я могу вернуть результаты, возвращенные из закрытого метода открытым методом?

вот так

public int longer()
{
  longer(a.length);
}

private int longer(int n)
{
  int index

  //find largest index recursively 
  //make recursive call longer(n-1)
  return index;
}

Я хочу передать его в открытый метод, а затем вернуть его оттуда,Могу ли я просто вернуть его из открытого метода, сказав return long.index;или что-то в этом роде?

Полагаю, мне следует уточнить.нет индекса.idnex рассчитывается на основе того, что передается в метод.публичное и частное - потому что это будет рекурсивный метод.я отредактирую то, что я написал выше, чтобы сделать его точным из того, что я пытаюсь сделать.передавая массив и рекурсивно работая над ним.

Ответы [ 3 ]

4 голосов
/ 29 сентября 2011
public int longer()
{
    return longerInternal(a.length);
}

private int longerInternal(int n)
{
    int index

    //find largest index recursively 
    //make recursive call longer(n-1)
    return index;
}

Из вашего public метода вы можете вызвать метод private. Я переименовал метод private, чтобы не было конфликта имен для ваших методов. Простая реализация должна выглядеть примерно так:

public class MyClass {
    private int[] a;

    public MyClass(int[] _a) {
        a = _a;
    }

    public int longer()
    {
        return longerInternal(a.length);
    }

    private int longerInternal(int n)
    {
        int index;
        //do recursive call
        return index;
    }
}

И это можно назвать так:

MyClass myClass = new MyClass(new int[]{1,2,3,4,5,10});
int result = myClass.longer();
0 голосов
/ 29 сентября 2011

Вы упомянули в ответе на комментарий, что «вызывающему не обязательно иметь доступ ко всем внутренним действиям класса».

Для меня это говорит о том, что вы хотите использовать интерфейс.

Создайте интерфейс, который описывает класс, который будет содержать этот секретный алгоритм:

package com.stevej;

public interface Longer {

  public int longer();

}

Реализуйте этот интерфейс, используя ваш секретный алгоритм:

package com.stevej;

public class LongerImpl implements Longer {

  private int longer(int n){
    return 0; // whatever
  }

  @Override
  public int longer() {
    return longer(5); // whatever
  }

}

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

package com.stevej;

public class LongerProcessor {

  Longer longerImpl = new LongerImpl();

  public LongerProcessor() {
    super();
  }

  public int longer() {
    return longerImpl.longer();
  }

}

Теперь вы можете переписывать реализацию Longer так часто, как вам нравится. Пока определение интерфейса никогда не изменяется, у вызывающей стороны (LongerProcessor) никогда не будет проблем. Черт, у вас может быть две или более разных реализаций (LongerImplRecursive, LongerImplBruteForce и т. Д.), Каждая из которых реализует Longer, и все они используются в разных местах одной и той же программы:

package com.stevej;

public class LongerProcessor {

  Longer longerImpl;

  public LongerProcessor(boolean useRecursive) {
    super();

    if (useRecursive){
      longerImpl = new LongerImplRecursive();
    }else{
      longerImpl = new LongerImplBruteForce();
    }
  }

  public int longer() {
    return longerImpl.longer();
  }

}

Насколько это круто? Поскольку вы пометили этот вопрос как «домашнее задание», мне интересно, должна ли проблема привлечь вас к размышлению о выделении контракта (интерфейса) и реализации (класса реализации).

0 голосов
/ 29 сентября 2011

Во-первых, вам, вероятно, нужны лучшие имена функций.

Вы бы вызвали вашу public функцию getLonger(int n), а затем передали ее вашей частной longer(int n) функции.Когда эта функция будет выполнена, она вернется к getLonger(int n), а затем вернется к вызывающей стороне.

...