2013-04-16 2 views
0

Итак, чтобы объяснить свой код ->Аннотация добытчики класса и сеттера в Java

У меня есть абстрактный класс типа Employee, у него есть свои собственные поля, такие как имена.

У меня есть классы Admin, Sales и Manager, которые распространяются от Employee. каждый из них имеет свои собственные поля, такие как fixedBonus для администратора, percentBonus для продаж и администратор сотрудников для менеджера.

У меня тогда есть класс водителя, который содержит ArrayList of Employees, поэтому он содержит админов, продавцов и менеджеров.

Моя проблема возникает с элементами Arraylist. Скажем, я получаю сотрудника класса Admin из ArrayList и пытаюсь добраться до своего поля fixedBonus с помощью getter getFixedBonus(), я просто не могу. Как я могу это сделать, чтобы использовать класс-получатели и сеттеры, а не только унаследованные? Вот копия моего кода, в котором возникает проблема. Конкретно проблема заключается в случаях 5 и 6 инструкции switch.

private Employee editAnEmployee(Employee emp) { 
    boolean exit = false; 
    boolean validChoice = false; 
    int choice = 0; 
    Boolean sure = false; // used in the switch statement 
    String newName; 
    double newValue; 
    Employee admin = new AdminWorker("0", "0", 0, 0, 0); // these are used 
    Employee sales = new SalesWorker("0", "0", 0, 0, 0, 0); // to check the 
    Employee manager = new Manager("0", "0", 0, 0); // class of the 
                // employee 
                // being sent 
                // in, to edit 
                // the fields 
                // the employee 
                // may hold 
    do { 
     do { 
      validChoice = true; 
      emp.toString(); 
      StdOut.println("Which field would you like to edit?"); 
      StdOut.println("1) First Name."); 
      StdOut.println("2) last Name."); 
      StdOut.println("3) Hourly rate."); 
      StdOut.println("4) Hours worked in the last week."); 
      if (emp.getClass().equals(admin)) { 
       StdOut.println("5) Fixed Bonus."); 
      } else if (emp.getClass().equals(sales)) { 
       StdOut.println("5) Percentage bonus on sales."); 
       StdOut.println("6) Value of sales made in the last week."); 
      } else if (emp.getClass().equals(manager)) { 
       StdOut.println("5) Department."); 
      } 
      StdOut.println("0) Exit."); 
      choice = StdIn.readInt(); 
      if (choice < 0 || choice > 4) { 
       if (emp.getClass().equals(admin) && choice <= 5) { 
        validChoice = true; 
       } else if (emp.getClass().equals(sales) && choice <= 6) { 
        validChoice = true; 
       } else if (emp.getClass().equals(manager)) { 
        validChoice = true; 
       } else { 
        StdOut.println("You entered an invalid number! Try Again..."); 
        validChoice = false; 
       } 
      } 
     } while (!validChoice); 
     switch (choice) { 
     case 0: 
      StdOut.println("You are now exiting..."); 
      exit = true; 
      break; 
     case 1: 
      StdOut.println("The employees first name is: " + emp.getFirstName() + ". What would you like the first name to be now?"); 
      newName = StdIn.readString(); 
      StdOut.println("Are you sure you want to change " + emp.getFirstName() + " to " + newName +"?(y/n)"); 
      sure = ynChoice(); 
      if(sure) emp.setFirstName(newName); 
      break; 
     case 2: 
      StdOut.println("The employees last name is: " + emp.getLastName() + ". What would you like the last name to be now?"); 
      newName = StdIn.readString(); 
      StdOut.println("Are you sure you want to change " + emp.getLastName() + " to " + newName +"?(y/n)"); 
      sure = ynChoice(); 
      if(sure) emp.setLastName(newName); 
      break; 
     case 3: 
      StdOut.println("The employees hourly rate is: " + emp.getHourlyRate() + ". What would you like the hourly rate to be now?"); 
      newValue = StdIn.readDouble(); 
      StdOut.println("Are you sure you want to change " + emp.getHourlyRate() + " to " + newValue +"?(y/n)"); 
      sure = ynChoice(); 
      if(sure) emp.setHourlyRate(newValue); 
      break; 
     case 4: 
      StdOut.println("The employee has worked: " + emp.getHoursWorked() + " hours in the last week. What would you like that to be now?"); 
      newValue = StdIn.readDouble(); 
      StdOut.println("Are you sure you want to change " + emp.getHoursWorked() + " to " + newValue +"?(y/n)"); 
      sure = ynChoice(); 
      if(sure) emp.setHoursWorked(newValue); 
      break; 
     case 5: 
      if (emp.getClass().equals(admin)) { 
       StdOut.println("The employees fixed bonus is: " + emp.getFixedBonus() + ". What would you like that to be now?"); 
       newValue = StdIn.readDouble(); 
       StdOut.println("Are you sure you want to change " + emp.getFixedBonus() + " to " + newValue +"?(y/n)"); 
       sure = ynChoice(); 
       if(sure) emp.setHoursWorked(newValue); 
      } else if (emp.getClass().equals(sales)) { 
       StdOut.println("The employees percentage bonus is: " + emp.getPercentageBonus() + ". What would you like that to be now?"); 
       newValue = StdIn.readDouble(); 
       StdOut.println("Are you sure you want to change " + emp.getPercentageBonus() + " to " + newValue +"?(y/n)"); 
       sure = ynChoice(); 
       if(sure) emp.setHoursWorked(newValue); 
      } else if (emp.getClass().equals(manager)) { 
       StdOut.println("The employees fixed bonus is: " + emp.getFixedBonus() + ". What would you like that to be now?"); 
       newValue = StdIn.readDouble(); 
       StdOut.println("Are you sure you want to change " + emp.getFixedBonus() + " to " + newValue +"?(y/n)"); 
       sure = ynChoice(); 
       if(sure) emp.setHoursWorked(newValue); 
      } 
      break; 
     case 6: 
      StdOut.println("The employees sales in the last week are: " + emp.getLastWeeksSales() + ". What would you like that to be now?"); 
      newValue = StdIn.readDouble(); 
      StdOut.println("Are you sure you want to change " + emp.getLastWeeksSales() + " to " + newValue +"?(y/n)"); 
      sure = ynChoice(); 
      if(sure) emp.setHoursWorked(newValue); 
      break; 
     } 
    } while (!exit); 
    return emp; 
} 
+2

Не могли бы вы просто сделать «абстрактный» класс сотрудников абстрактными методами получения? Таким образом, классы, расширяющие класс Employee, должны определять собственное поведение геттера. –

+0

Включите объект в подходящий тип. ((AdminWorker) emp) .getFixedBonus() – dnault

ответ

3

Я думаю, что InstanceOf ключевое слово может быть полезным в вашей ситуации.

ArrayList<Employee> list; // This is initialized and has Employees 

for (Employee person: list) { 
    if (person instanceof Admin) { 
     int fixedBonus = ((Admin) person).getFixedBonus(); 

     // Do something here 
    } 
} 

Ответил ли это на ваш вопрос? (Вам не нужно .getClass() равно(), это то, что InstanceOf для:. D)

+1

Вот именно то, что мне нужно! Спасибо :) –

2

Вы должны добавить getFixedBonus() и getPercentBonus() методы вашего сотрудника, каждый из которых возвращает 0. Тогда остальные классы рабочих могут переопределить их ,

На самом деле, лучше всего сделать это interface и сделать все классы (в том числе Employee) реализовать interface. Затем они могут extend a base класс, который также реализует интерфейс, но предоставляет значения по умолчанию.

public static interface Staff { 
    public double getFixedBonus(); 
    public double getPercentageBonus(); 
    public List<Staff> getMinions(); 
} 

// Base class - no bonus by default. 
public static class Worker implements Staff { 

    @Override 
    public double getFixedBonus() { 
    return 0; 
    } 

    @Override 
    public double getPercentageBonus() { 
    return 0; 
    } 

    @Override 
    public List<Staff> getMinions() { 
    return Collections.EMPTY_LIST; 
    } 

} 

public static class Administrator extends Worker implements Staff { 
    double fixedBonus = 2.13; 

    @Override 
    public double getFixedBonus() { 
    return fixedBonus; 
    } 

} 

public static class Salesperson extends Worker implements Staff { 
    double percentageBonus = 3.14; 

    @Override 
    public double getPercentageBonus() { 
    return percentageBonus; 
    } 

} 

public static class Manager extends Worker implements Staff { 
    List<Staff> minions; 

    @Override 
    public List<Staff> getMinions() { 
    return minions; 
    } 
} 

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

+0

Это довольно справедливо, особенно для чего-то вроде getPercentageBonus() или getFixedBonus(), что имеет смысл применить к Employee. Я бы сказал, что немного необязательно давать каждому сотруднику метод getMinions(), но я полагаю, он соответствует тому, что вы сделали для администраторов и продавцов. Глен, это, вероятно, лучший способ сделать это в долгосрочной перспективе. – mdierker

0

Варианта, который делает ваш код клиента что много более простой (и чище - InstanceOf и литье некрасиво) является объявить реализацию по умолчанию для каждого конкретного метода в Employee, например, возвращать ноль для fixedBonus() в Employee, но наиважнейшей это в Sales

Смежные вопросы