Java: как правильно вернуть результат с помощью метода - PullRequest
0 голосов
/ 03 ноября 2018

Я пишу программу, которая напечатает «В зависимости от вероятной температуры» сезона A, B, C или D, вызвав метод.

Код:

import java.util.Scanner;
import javax.swing.*;

public class Seasons {

  public static void main(String[] args) {
    int inputTemp;
    String response = JOptionPane.showInputDialog(null,
            "Enter the temperature");
    inputTemp = Integer.parseInt(response);
    String message = "Based on the temperature of " + inputTemp
            + " it is most likely " + determineSeason(inputTemp);
    JOptionPane.showMessageDialog(null, message);

  }

  public static String determineSeason(int inputTemp) {
    String season = null;
    if (inputTemp > 130 || inputTemp < -20) { 
        JOptionPane.showMessageDialog(null,"Invalid");
    }

    else if (inputTemp >= 90) {
        JOptionPane.showMessageDialog(null,"summer"); }

    else if (inputTemp >= 70 && inputTemp < 90) {
        JOptionPane.showMessageDialog(null,"spring"); }
    else { 
        JOptionPane.showMessageDialog(null,"winter"); }

    return season; 
  }
}

Программа возвращает с JOptionPane сезон из моего метода, затем представляет JOptionPane из основного метода, где мне нужно сказать: «В зависимости от температуры сезон - это сезон A, B, C или D.

Буду признателен за любой совет по поводу того, чего мне не хватает!

Ответы [ 3 ]

0 голосов
/ 03 ноября 2018

determineSeason должен быть закрытым методом, который не работает с частями пользовательского интерфейса (не взаимодействует с компонентами Swing).

private String determineSeason(int inputTemp) {
    if (inputTemp > 130 || inputTemp < -20) { 
        throw new IllegalArgumentException("Invalid");
    }

    if (inputTemp >= 90) {
        return "summer";
    } else if (inputTemp >= 70 && inputTemp < 90) {
        return "spring";
    } else { 
        return "winter";
    }
}

season не может быть "Invalid", вы не собираетесь отображать "it is most likely Invalid", поэтому лучше выбросить исключение из метода, перехватить его на стороне вызывающей стороны и показать окно сообщения об ошибке:

class Seasons {

    public static void main(String[] args) {
        String response = JOptionPane.showInputDialog(null, "Enter the temperature");
        int inputTemp = Integer.parseInt(response);
        try {
            String message = String.format("Based on the temperature of %d, it is most likely %s", inputTemp, determineSeason(inputTemp));
            JOptionPane.showMessageDialog(null, message);
        } catch (IllegalTemperatureValueException | NumberFormatException e) {
            JOptionPane.showMessageDialog(null, e.getMessage(), "Error", JOptionPane.ERROR_MESSAGE);
        }

    }

    private static String determineSeason(int inputTemp) throws IllegalTemperatureValueException {
        if (inputTemp > 130 || inputTemp < -20) {
            throw new IllegalTemperatureValueException("incorrect temperature value");
        }

        return inputTemp >= 90 ? "summer" : (inputTemp >= 70 ? "spring" : "winter");
    }
}

class IllegalTemperatureValueException extends Exception {
    public IllegalTemperatureValueException(String message) {
        super(message);
    }
}
0 голосов
/ 04 ноября 2018

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

Даже в небольших или простых проектах рассмотрите интерфейсно-ориентированное программирование, которое заставляет вас задуматься, прежде чем объявлять новый метод.

Season.java

public abstract class Season {

    public <T extends Season> Stream season(Integer temperature) {
        if (temperature <= max() && temperature >= min()) {
            return Stream.of(this);
        }
        return Stream.empty();
    }

    public abstract Integer max();

    public abstract Integer min();

    @Override
    public abstract String toString();
}

Summer.java

public class Summer extends Season {

    @Override
    public String toString() {
        return "Summer";
    }

    @Override
    public Integer max() {
        return 90;
    }

    @Override
    public Integer min() {
        return 70;
    }
}

Spring.java

public class Spring extends Season {

    @Override
    public String toString() {
        return "Spring";
    }

    @Override
    public Integer max() {
        return 69;
    }

    @Override
    public Integer min() {
        return 40;
    }
}

Main.java

public class Main {

    public static void main(String[] args) {

        Collection<Season> seasons = new ArrayList();
        seasons.add(new Summer());
        seasons.add(new Winter());
        seasons.add(new Season() {
            @Override
            public Integer max() {
                return 39;
            }

            @Override
            public Integer min() {
                return 10;
            }

            @Override
            public String toString() {
                return "Winter";
            }
        });

        String response = JOptionPane.showInputDialog(null, "Enter the temperature");
        int temperature = Integer.parseInt(response);
        String msg = "Based on the temperature of %d it is most likely %s%n";

        seasons.stream().forEach(s -> {
            s.season(temperature).findAny().ifPresent(t -> {
                String message = String.format(msg, temperature, t);
                JOptionPane.showMessageDialog(null, message);
            });
        });
    }
}
0 голосов
/ 03 ноября 2018

Вы не присваиваете результат season, а просто возвращаете null.

Измените каждое условие внутри вашего оператора if на что-то вроде этого.

String season = null;
if (inputTemp > 130 || inputTemp < -20) {
    season = "invalid";
} else if(inputTemp >= 90) {
    season = "summer";
}
...