Про return более подробно?

94
09 января 2021, 06:00

Начал изучать программирование и начал с языка Java и столкнулся с трудностью, поэтому прошу помощи.

Объясните пожалуйста про return более подробно. Почему в примере кода return используется только в случае с amountToWithdraw, и почему его не используют также в случае с amountToDeposit?

Пример кода:

public class SavingsAccount {
  int balance;
  public SavingsAccount(int initialBalance){
    balance = initialBalance;
  }
  public void checkBalance(){
    System.out.println("Hello!");
    System.out.println("Your balance is "+balance);
  }
  public void deposit(int amountToDeposit){
    balance = balance + amountToDeposit;
    System.out.println("You just deposited "+amountToDeposit);
  }
  public int withdraw(int amountToWithdraw){
    balance = balance - amountToWithdraw;
    System.out.println("You just withdrew "+amountToWithdraw);
    return amountToWithdraw;
  }
  public String toString(){
    return "This is a savings account with " + balance + " saved.";
   }  
  public static void main(String[] args){
    SavingsAccount savings = new SavingsAccount(2000);    
    savings.checkBalance();    
    savings.withdraw(300);    
    savings.checkBalance();    
    savings.deposit(600);    
    savings.checkBalance();
    savings.deposit(600);
    savings.checkBalance();
    System.out.println(savings);
  }       
}
Answer 1

Методы, в зависимости от того, что нужно автору программы, могут возвращать значение того или иного типа, а могут не возвращать никакого значения. Те, которые вычисляют и возвращают какое-то значение, по смыслу соответствуют математическому понятию функции (типа у = sin(x)), и в некоторых языках так и называются -- функции. Те, которые просто совершают какие-то действия, но не возвращают никакого значения, по смыслу соответствуют тому, что в других языках называется процедуры. Методы первого типа в Java описываются с указанием типа результата и обязаны явно использовать как минимум один оператор return с указанием возвращаемого значения, причем компилятор проверяет, что тот или иной из этих операторов выполнится неизбежно, при любых обстоятельствах (кроме случаев возникновения исключений). Ведь внутри тела метода могут вычисляться несколько разных значений, а компилятор должен знать, какое именно из них должно являться результатом вычисления функции. Например:

public double sqrtOfSinMultByCos(double a, double b) {
  double sin = Math.sin(a);
  double cos = Math.cos(b);
  return Math.sqrt(sin * cos);
}
public int badMethod(int a) { // Не откомпилируется,
  // сругается "This method must return a result of type int" 
  if (a >= 10) {
    return a / 10;   // оператор return есть, 
                     // но его выполнение не гарантировано:  
  } else {           // В этом случае return не выполнился бы 
    System.out.println("a меньше 10"); 
  }
}

Методы второго типа, которые просто выполняют какие-то действия и не возвращают никакого значения, описываются с ключевым словом void, которое используется вместо указания типа результата, и не обязаны, но могут иметь явный оператор return. Например:

public void printSqrtOfSinMultByCos(double a, double b) {
  double sin = Math.sin(a);
  double cos = Math.cos(b);
  System.out.println(Math.sqrt(sin * cos));
}

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

// Найти макс. x, x <= 10, на которое делится n
publiс void reportDivisibility(int n) {
  if (n % 10 == 0) {
    System.out.println("n делится на 10"); return; 
  }
  // Если n делится на 10, другие условия не проверяются
  // TODO Добавить проверку других признаков делимости 
  if (n % 3 == 0) {
    System.out.println("n делится на 3"); return; 
  }
  if (n % 2 == 0) {
    System.out.println("n -- четное"); return; 
  }
  System.out.println("n не делится на числа 2..10";      
}

Этот же прием можно использовать и в методах, возвращающих результат:

public BigDecimal max(BigDecimal a, BigDecimal b) {
  if (a.compareTo(b) > 0) 
    return a;
  return b;
}

Здесь return b выполняется только в том случае, если не выполнилось условие оператора if и соответственно не выполнилось return a;.

Answer 2

Зависит от возвращаемого типа метода к которому вы обращаетесь. В вашем случае возвращаемым типом метода public int withdraw(int amountToWithdraw) является тип int, соответственно метод должен иметь точку выхода со значением типа int. Для метода public String toString() это return "This is a savings account with " + balance + " saved."; у которого тип String и.т.д.

А метод public void checkBalance() помечен как void и не возвращает ничего. Можно преждевременно прекратить выполнение вызвав пустой return;

https://docs.oracle.com/javase/tutorial/java/javaOO/returnvalue.html

Answer 3

Просто потому что автору взбрело в голову так написать.

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

Кстати, ещё охапка косяков этого кода:

  • Значение balance можно получить только как часть строки после toString() - никакого геттера не предусмотрено.
  • Класс явно рассматривается как единица инкапсуляции сведений о счёте, но при этом в нём же расположен метод main(), являющийся стартовой точкой программы. Во-первых, это уже так себе стиль, во-вторых, такое расположение позволит обращаться из него в приватным полям.
  • Если классы пока не рассматривались, то я бы делал всё статическим, чтобы получилась простая однофайловая программа. А тут какой-то гибридный вариант.

Если это код из учебника, и в нём не поясняется, что что-то сделано для примера и ничего не говорится о существовании недостатков (которые будут исправляться в дальнейшем), я бы рекомендовал его сменить.

READ ALSO
Не запускается проект GWT в Intellij Idea

Не запускается проект GWT в Intellij Idea

При запуске пишет ошибку:

126
HTML. При нажатии на кнопку всплывает форма

HTML. При нажатии на кнопку всплывает форма

Ребят, очень нужноКак сделать так, чтобы при нажатии на кнопку всплывала форма с с полями, куда пользователь мог бы внести данные и тем самым...

118
Uncaught TypeError: Cannot read property &#39;style&#39; of null

Uncaught TypeError: Cannot read property 'style' of null

Здраствуйте, у меня появилась проблема - Uncaught TypeError: Cannot read property 'style' of null

115
Remove в JavaScript

Remove в JavaScript

Не получается удалить объект

118