Пользовательский ввод и использование методов из другого класса

#java

#java

Вопрос:

Все еще изучаю Java, немного идиот, и я прошу прощения за беспокойство. У меня есть вопрос относительно использования пользовательского ввода из main.class с помощью employee.class с геттерами и сеттерами и возвращением их обратно в main.class . Это правильный способ использования методов из employee.class с помощью пользовательского ввода? Было бы хорошо просто указать мне правильное направление.

Вот Employee.class для чего требовалось значение по умолчанию true.

  public class Employee() {
        private String id = "100";
        private boolean manager = true;

public Employee(String id, String name, int numOfYears) {
    this.id = id;
    this.name = name;
    this.numOfYears = numOfYears;
}

public Employee(String id, String name, int numOfYears, double 
    monthlySalary, boolean manager) {
    this.id = id;
    this.name = name;
    this.numOfYears = numOfYears;
    this.monthlySalary = monthlySalary;
    this.manager = manager;
}

public String getId() {
    return id;
    }

public void setId(String id) {
    this.id = id;
    }
public boolean getManager() {
    return manager;
    }

public void setManager(boolean manager) {
    if (manager == true) {
        System.out.println("Yes");
        this.manager = manager;
    } else {
        System.out.println("No");
        this.manager = manager;
        }
    }
}
 

И вот Main.class

 import java.util.Scanner;
public class Main {

    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);

        System.out.println("Enter employee ID:");
        int i = input.nextInt();
        String id = Integer.toString(i);

        System.out.println("In management? True/False");
        boolean manager = input.nextBoolean();

        Employee empId = new Employee(id);
        empId.setId(id);

        Employee empManager = new Employee();
        empManager.setManager();

    }
}
 

Будет ли правильный способ ввода пользовательских значений

         Employee empManager = new Employee(manager);
        empManager.setManager();
 

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

Комментарии:

1. @Onecricket Спасибо за редактирование

2. Конечно, но public Employee(String id) сам по себе отсутствует для new Employee(id); корректной работы

Ответ №1:

Это неправильный способ.

Правильным способом было бы определить правильный конструктор:

 public Employee(String id, boolean isManager)
{
    this.id = id;
    this.isManager = isManager;
}
 

и назовите это так:

 Employee employee = new Employee(id,isManager);
 

Краткая подсказка: для логических значений рекомендуется называть их «isXYZ» — вот почему я изменил имя. Кроме того, an if(var == true) может быть записан как if(var) — true неявно.

Комментарии:

1. Ах, извинения. Я забыл прикрепить конструкторы. Меня попросили добавить 2 конструктора. Спасибо за ответ maio и за подсказку о == true . Правильно ли я выписал объект employee? Также было запрошено, чтобы элемент данных для проверки, является ли сотрудник менеджером или нет, был «менеджером» employee.class , нужно ли мне все еще менять его на isManager?

2. Это домашнее задание, не так ли? Вы бы ничего не напечатали в методе set. Но создание двух объектов employee — это неправильная вещь. Вы можете заменить примитивные значения их аналогом класса, чтобы обнулить их. Таким образом, вы могли бы просто передать null для примитивных значений в конструкторе. Также вам необходимо определить все поля, на которые вы ссылаетесь с этим в своем классе. Вы можете называть свои переменные так, как хотите — имя вообще не подразумевает никакой логики 😉

3. Да, для назначения. Разрешено ли нам обращаться за помощью по назначениям? Извиняюсь, если это не разрешено, и я удалю, если это так. Ценю помощь независимо от maio.

4. Это нормально, если вы не просите других выполнять вашу работу.

5. О, конечно. Я не пытался выполнить работу за меня. Вот почему я просто попросил подтолкнуть в правильном направлении. Я знаю, что я бы просто накручивал себя, если бы не пытался понять, что я делаю неправильно. Еще раз извините, если так получилось.

Ответ №2:

Правильный ответ заключается в том, что нет «правильного» ответа. Это на 100% философский вопрос с рядом «правильных» ответов. Тем не менее, есть некоторые вещи, с которыми большинство разработчиков согласятся, с которыми вам нужно учитывать, чтобы решить, какой «правильный» ответ является правильным ДЛЯ ВАС.

  1. Какие параметры вы должны передать через конструктор? Конструктор следует использовать для принудительного применения ТРЕБУЕМЫХ значений во время построения. Например, name и id мы можем согласиться, должны быть обязательные поля. Но как насчет managerName ? Возможно, менеджер по какой-то причине не был назначен на момент найма (т. Е. Должность вакантна).
  2. Поскольку иметь методы установки нормально, можно также использовать их. Нет ничего плохого в предоставлении метода setter и использовании такого метода для установки значения ПОСЛЕ создания объекта. Как правило, мы включаем методы получения / установки для всех полей. ТЕМ не менее, я думаю, что лучше решить, какие поля (если таковые имеются) являются постоянными, и предоставить установщики (очевидно) только для переменных полей.

Ради аргумента давайте предположим, что пользователь не должен иметь возможности изменять свое имя. В этом случае я бы спроектировал свой Employee класс следующим образом:

 public class Employee {
    private final String name; // Required (constant)
    private final String id; // Required (constant)
    private String phoneNo; // optional
    private String managerName; // "optional"
    private boolean isManager; // required (variable)

    public Employee (String name, String id) {
        this.name = name;
        this.id = id;
    }

    public void setPhoneNo(String phoneNo) { this.phoneNo = phoneNo; }

    public void setManagerName(String managerName) { this.managerName = managerName; }
}
 

Также учитывайте значения по умолчанию. В Java примитивные типы данных имеют следующие значения по умолчанию: числовые примитивы имеют значение по умолчанию 0. Логические примитивы по умолчанию false равны, символьный примитив по умолчанию равен значению символа Юникода NULL (u0000). Это означает, что, если вам не нужно переопределять значение по умолчанию, установка значения может быть необязательной (даже если значение является обязательным). Что это значит? В вашем примере у вас есть логический флаг, указывающий, находится ли сотрудник в управлении. Зная, что большинство сотрудников не будут в управлении, конструктора приведенного выше примера должно быть достаточно. Для кого-то, кто нанят в качестве менеджера, вы можете предоставить конструктор с тремя аргументами для передачи «true» в это логическое поле ИЛИ просто создать объект employee с помощью существующего конструктора, а затем использовать метод setter для установки этого флага в true.

 Employee hector = new Employee("Hector", "100");
hector.setManager(true);
 

Вышеуказанное будет столь же приемлемым, как

 Employee hector = new Employee ("Hector", "100", true);
 

Наличие этого конструктора с тремя аргументами не отменяет необходимость использования двух аргументов one. Можно сохранить оба. Однако, если вы должны это сделать, используйте шаблон телескопирования…

 public Employee (String name, String id, boolean isManager) {
    this(name, id); // calling the two-arg constructor
    this.isManager = isManager;
}