Можно ли в параметры конструктора передать переменную полученную в методе

Всем привет! Интересует такой вопрос: есть такой код, который вычисляет срок годности продукта. Даты реализуются через рандомайзер для имитации процесса "годен/не годен". Вот даты из этого куска хотелось бы передавать в конструктор, чтобы не вводить в ручную при создании объекта в методе main. Можно как-то это реализовать?

public void makeDates() thorws ParseException {
    int randDateMade = (int) (Math.random());
    int randDateExp = (int) (Math.random() * 10);
    Date currentDate = new Date();
    SimpleDateFormat formatForDate = new SimpleDateFormat("EEEE dd MMMM yyyy");
    Calendar calendarForDateMade = Calendar.getInstance();
    calendarForDateMade.add(Calendar.DAY_OF_MONTH, randDateMade);
    String formatDateMade = formatForDate.format(calendarForDateMade.getTime());
    //System.out.println("Дата изготовления - " + formatDateMade);
    Calendar calendarForDateExp = Calendar.getInstance();
    calendarForDateExp.add(Calendar.DAY_OF_MONTH, randDateExp);
    String formatDateExp = formatForDate.format(calendarForDateExp.getTime());
    //System.out.println("Употребить до - " + formatDateExp);
    Date dateMade = formatForDate.parse(formatDateMade);
    Date dateExp = formatForDate.parse(formatDateExp);
    long countDate = dateExp.getTime() - currentDate.getTime();
    int countDays = (int) (countDate / (24 * 60 * 60 * 1000) + 1);
    

}

К примеру, вот есть у меня класс и конструктор:

public class Production {
         private String name;
         private double price;
         private Date madeDate;
         private Date expDate;

public Production(String name, double price, Date madeDate, Date expDate){
        this.name = name;
        this.price = price;
        this.madeDate = dateMade;
        this.expDate = dateExp;
    }

Ответы (1 шт):

Автор решения: Дмитрий

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

  1. все классы, которые вы используете для работы с датами, фактически являются deprecated, т.е. устаревшими. Это вообще позор java . Посему использовать их настоятельно не рекомендуется. В java 8 появился отдельный пакет java.time для этих целей, который по сути является приемником joda time.
  2. старайтесь избегать методов с большим количеством кода. разбивайте логику на части. самое простое объяснение этому в том, что с одной стороны, методы с большим количеством логики очень сложно читать (т.е. понять, что именно они делают), с другой стороны их невозможно переиспользовать (посмотрите как я переиспользую метод генерации случайных чисел в примере ниже), ведь их логика решает огромное количество задач (этим , кстати, нарушает SOLID).
  3. на данном конкретном примере , на мой взгляд, первый шаг к ооп - это осознание простого правила: класс состоит из полей и методов, при этом методы нужны для того, чтобы обрабатывать исключительно (!) данные, которые хранят поля. Например, вы хотите понять, истек ли срок годности продукта. В этом случае корреткным решением является написание метода в классе Product , а некорректным - получение значения поля expDate из класса Product в методе другого класса и реализация там же соответствующей логики. ровно как и консольный вывод информации о продукте должен быть реализован в методе toString(), а не где - либо еще (это соответствует GRASP-паттерну information expert).
  4. никогда (!) не используйте для хранения денег переменные с плавающей точкой! никому не нужно знать приблизительное количество его денег. на большом количестве расчетов вы рискуете получить такие погрешности, которым точно не обрадуетесь. посему деньги в минимальную единицу измерения (копейки, центы итд) и пишем в long, biginteger. без вариантов.

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

import java.text.ParseException;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.Random;

public class Test {

    public static void main(String[] args) throws ParseException {
        for (int i = 1; i < 10; i++) {
            System.out.println(createProduct("Product " + i));
        }
    }

    private static Product createProduct(String name) {
        LocalDate randDateMade = LocalDate.now().minusDays(getRandomInRange(30, 120));
        LocalDate randDateExp = randDateMade.plusDays(getRandomInRange(30, 120));
        return new Product(name, Long.valueOf(getRandomInRange(100, 10_000)), randDateMade, randDateExp);
    }

    private static int getRandomInRange(int min, int max) {
        return new Random().ints(min, max).findFirst().getAsInt();
    }
}

class Product {

    private final static DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("dd.MM.yyyy");

    private final String name;
    private final Long price;
    private final LocalDate madeDate;
    private final LocalDate expDate;

    public Product(String name, Long price, LocalDate madeDate, LocalDate expDate) {
        this.name = name;
        this.price = price;
        this.madeDate = madeDate;
        this.expDate = expDate;
    }

    public boolean isExpired() {
        return LocalDate.now().isAfter(expDate);
    }

    @Override
    public String toString() {
        return name + "; цена : " + (price / 100d) + "; дата изготовления : " + FORMATTER.format(madeDate)
                + "; употребить до : " + FORMATTER.format(expDate) + "; " + (isExpired() ? "не годен" : "годен");
    }

} 
→ Ссылка