MovieFactory

  • 16
  • Недоступна
У вас есть код программы MovieFactory, разберитесь, что она умеет делать. Добавьте классы Cartoon, Thriller и разберитесь, как мы получаем объект класса SoapOpera по ключу "soapOpera".
Вы не можете решать эту задачу, т.к. не залогинены.
Комментарии (395)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
SVCH
Уровень 39
23 декабря 2022, 10:56
while ((key = reader.readLine()) != null) - это по сути while(true)? И выход только через return?... Имхо лучше так:
while ((movie = MovieFactory.getMovie(reader.readLine())) != null){
            System.out.println(movie.getClass().getSimpleName());
        }
Slava Melnikov
Уровень 28
24 января, 08:45
А еще на мой взгляд читать код приятней когда в условие цикла не заложено какое-то длинное выражение, а просто фраза которая четко описывает в каком случае продолжаем цикл, например:
boolean isKeyCorrect = true;

        while (isKeyCorrect) {
            key = reader.readLine();
            Movie movie = MovieFactory.getMovie(key);
            if (key.matches("soapOpera|cartoon|thriller")) {
                System.out.println(movie.getClass().getSimpleName());
            } else {
                isKeyCorrect = false;
            }
        }
Anonymous #3146126
Уровень 22
12 декабря 2022, 20:53
Почемуто не принимало решение
Movie movie = MovieFactory.getMovie(key);
            if(movie == null) break;
            System.out.println(movie.getClass().getSimpleName());
а в обратной последовательности приняло
Movie movie = MovieFactory.getMovie(key);
            if(movie != null) {
                System.out.println(movie.getClass().getSimpleName());
            } else {
                break;
            }
LxstFlight
Уровень 24
1 декабря 2022, 19:01
Вызов функции с хреновой строкой кидает исключение, связанное с тем что метод возвращает null Не парьтесь и оберните в try catch))
Andrey Dudin
Уровень 37
3 декабря 2022, 15:09
у меня не кидает исключений, ну разве что запросить у него .getClass
Anonymous #2763716
Уровень 20
4 декабря 2022, 11:44
Соглашусь с одним из ранних комментаторов, который писал, будто тут намеренно учат плохим паттернам. Один из примеров в данной задаче - для чего вообще передавать значение null в метод getMovie() класса MovieFactory, если такие случаи нужно отлавливать как можно раньше?
LxstFlight
Уровень 24
6 декабря 2022, 12:59
Да, бред полный)
Gvrko
Уровень 29
7 января, 20:46
Но если сделать проверку на null в цикле, вместе с вызовом метода MovieFactory.getMovie(), то и выбрасывать исключение не будет, произойдет завершение программы.
Dimon
Уровень 27
25 ноября 2022, 11:59
Я один через ArrayList решаю?)) Через валидатор еще не проверял, но работает правильно. Коплю по 20 решенных задач, потом проверяю в один день, собираю ачивки))
public class Solution {
    public static void main(String[] args) throws Exception {
        Scanner console = new Scanner(System.in);
        String movieString;
        ArrayList<String> moviesList = new ArrayList<>(Arrays.asList("cartoon","thriller","soapOpera"));
        ArrayList<String> addMoviesList = new ArrayList<>();
        while (true) {
            movieString = console.nextLine();
            if (moviesList.contains(movieString)) {
                addMoviesList.add(movieString);
            }
            if (!moviesList.contains(movieString)) {
                MovieFactory.getMovie(movieString);
                console.close();
                break;
            }
        }
        addMoviesList.forEach(movie -> MovieFactory.getMovie(movie));
    }

    static class MovieFactory {

        static Movie getMovie(String key) {
            Movie movie = null;

            if ("soapOpera".equals(key)) {
                movie = new SoapOpera();
                System.out.println(movie.getClass().getSimpleName());
            }
            if ("cartoon".equals(key)) {
                movie = new Cartoon();
                System.out.println(movie.getClass().getSimpleName());
            }
            if ("thriller".equals(key)) {
                movie = new Thriller();
                System.out.println(movie.getClass().getSimpleName());
            }
            return movie;
        }
    }

    static abstract class Movie {
    }

    static class SoapOpera extends Movie {
    }
    static class Cartoon extends Movie {

    }
    static class Thriller extends Movie {

    }
}
Олег Пономарев
Уровень 25
26 ноября 2022, 16:25
Тоже ArrayList использовал, но в него складывал объекты movie - те что не равны null (по условию задачи, как оказалось, надо вызвать метод getMovie() даже для некорректной строки ввода), потом в foreach выводил имена классов. Валидатор пропустил.
Anonymous #3146126
Уровень 22
12 декабря 2022, 20:45
addMoviesList здесь не нужен, так как он всегда будет состоять из одного элемента, а вместо
addMoviesList.add(movieString);
использвать так же как у тебя и в следующем ифе
MovieFactory.getMovie(movieString);
zimbaby
Уровень 28
6 ноября 2022, 12:13
Мне одному хочется переломать ноги сказать спасибо тому кто писал условия задачи и комментарии внутри программы ?
Илья Бунин
Уровень 28
19 ноября 2022, 06:51
Поддерживаю. Но с другой стороны это тоже тренировка реальной работы)))
Anonymous #2763716
Уровень 20
4 декабря 2022, 11:35
Не вводите других в заблуждение. Вы не правы!
Илья Бунин
Уровень 28
6 декабря 2022, 01:26
Ну это же шутка, вы чего) Хотя, в каждой шутке есть доля шутки/правды (нужное подчеркнуть).
Kris86
Уровень 30
1 ноября 2022, 10:15
не понимаю почему нул?
Ivan_sl13
Уровень 28
15 ноября 2022, 10:03
Какую бы мы строку не ввели она передается в класс MovieFactory и вызывает ее метод getMovie(key). В методе если swich не находит эквивалентных значений то присваивает Movie movie = null, и возвращает в цикл wile, где далее идет проверка на (movie == null). Те можно не делать свою проверку в цикле while.
Kris86
Уровень 30
15 ноября 2022, 10:08
благодарю👍
Sergei Kirianov
Уровень 25
29 января, 17:17
Спасибо за коммент!
Юлия
Уровень 29
26 октября 2022, 09:32
Интересная задача, но как же бесят эти вложенные статические классы.
Yuri UA
Уровень 38
13 октября 2022, 16:50
Правильное решение вообще порадовало 😁
while ((key = reader.readLine()) != null) {
           Movie movie = MovieFactory.getMovie(key);
           if (movie == null) {
               return;
           }
BlackGrizzli Team
Уровень 43
25 октября 2022, 08:43
А почему тут return , а не break ? В чем отличие ?
Yuri UA
Уровень 38
25 октября 2022, 09:38
boolean isMovie = key.equals("soapOpera") || key.equals("cartoon") || key.equals("thriller");
            if (!isMovie) {
                movie = MovieFactory.getMovie(key);
                break;
            }
У меня так, но так как в методе getMovie объект movie = null по умолчанию то его и возвращаем при некорректно введенной строке.
BlackGrizzli Team
Уровень 43
25 октября 2022, 09:48
Так и я break писал ! И отличия с return не заметил. Так пояснительная бригада, расскажите в чем отличие ???
Yuri UA
Уровень 38
25 октября 2022, 10:12
return сам по себе вызовет метод "MovieFactory.getMovie(key);" с некорректной строкой, но не выведет его на экран и завершит работу метода мэйн, оператор return всегда что-то возвращает и завешает работу метода.
static class MovieFactory {

       static Movie getMovie(String key) {
           Movie movie = null;
           if ("soapOpera".equals(key)) {
               movie = new SoapOpera();
           } else if ("cartoon".equals(key)) {
               movie = new Cartoon();
           } else if ("thriller".equals(key)) {
               movie = new Thriller();
           }
           return movie;
       }
   }
Вернет этот null, соответственно предпоследнему требованию, завершит программу и ничего в консоль не выведется.
Mikhail Khanov
Уровень 22
2 декабря 2022, 12:33
break прерывает цикл, return прерывает метод/ выходит из метода (в нашем случае метод main). Соответственно, если после цикла есть какой-то код, то в случае с break, он выполнится, в случае с return - нет, т.к. программа выйдет из метода. Например, Выполнится:
while(true){
            //какая-то логика
            break;
        }
System.out.println("Данный код выполнится после break");
Не выполнится:
while(true){
            //какая-то логика
            return;
        }
System.out.println("Данный код не выполнится после return");
Dok3R73
Уровень 34
13 октября 2022, 10:09
Подсказка. Для некорректной строки не нужно выводить на экран значение. Нужно просто вызвать у нее метод MovieFactory.getMovie(некорректная строка);
21 сентября 2022, 23:03
Хочу тебя, коллега, предупредить. Валидатор не примет решение, если твоя прога при вводе "некорректной" строки, кидает NullPointerException. Рекомендую проверять корректность введенной строки не так, как ты себе это представляешь (в цикле while), а проверять тот объект, который будет создан на основании этой "некорректоной строки". Расшифровывать не буду ибо спойлеры.