不确定我是否应该拆分我的子类

时间:2016-11-05 17:00:22

标签: java arraylist split text-files subclass

我有一个文本文件,可以读取各种员工的信息。 我创建了两个基于Employee对象年份的数组列表。 Employee有两个子类,Salesman和Executive。我想知道如果有两个子类我应该用逗号分割它,因为我不能调用超类

这是员工类

public class Employee 
{
private String name;
private double monthlySalary;

public Employee(String line)
{
    String[]split=line.split(",");
    name=split[0];
    monthlySalary=Double.parseDouble(split[1]);
}



public String getName() {
    return name;
}



public void setName(String name) {
    this.name = name;
}



public double getMonthlySalary() {
    return monthlySalary;
}



public void setMonthlySalary(double monthlySalary) {
    this.monthlySalary = monthlySalary;
}



public double annualSalary()
{
    return monthlySalary*12;
}


public String toString()
{
    String str;
    str="Name: "+name;
    str+="\nMonthly Salary: "+monthlySalary;
    return str;
}
}

推销员类

public class Salesman extends Employee
{
private double annualSales;

public Salesman(String name, double monthlySalary, double annualSales)
{
    super(name,monthlySalary);
    this.annualSales=annualSales;
}



public double getAnnualSales() {
    return annualSales;
}



public void setAnnualSales(double annualSales) {
    this.annualSales = annualSales;
}



public double annualSalary()
{
    double commision=annualSales*0.02;
    if (commision>20000)
    {
        commision=20000;
    }
    double totalSalary=super.annualSalary()+commision;
    return totalSalary;
}


public String toString()
{
    return super.toString()+"\nAnnual Sales: "+annualSales;
}
}

行政级别

public class Executive extends Employee
{
private double stockPrice;

public Executive(String name, double monthlySalary, double stockPrice)
{
    super(name,monthlySalary);
    this.stockPrice=stockPrice;
}


public double getStockPrice() {
    return stockPrice;
}


public void setStockPrice(double stockPrice) {
    this.stockPrice = stockPrice;
}


public double annualSalary()
{
    double bonus=0;
    if(stockPrice>50)
    {
        bonus=30000;
    }
    double totalSalary=super.annualSalary()+bonus;
    return totalSalary;
}


public String toString()
{
    return super.toString()+"\nStock Price: "+stockPrice;
}
}

和驱动程序类

import java.io.*;
import java.util.*;
public class employeeDriver
{
public static void main(String[] args)
{
    String input;
    Scanner readInput=null;
    Scanner readFile = null;

    try
    {
        readFile=new Scanner(new File("C:\\mywork\tester.txt"));
    }
    catch(FileNotFoundException e)
    {
        System.out.println("The file can't be opened");
        System.exit(0);
    }
    List<Employee> firstList= new ArrayList<>();
    List<Employee> secondList= new ArrayList<>();


    while(readFile.hasNextLine())
    {
      //To be inserted
    }
}

}

2 个答案:

答案 0 :(得分:0)

我使用拆分方法你的意思是解析文件,我认为你应该把这个登录放在另一个与Employee无关的类中。

这可能类似于ParseEmployeeFile或ScanEmpoyeeFile,方法是 parse() scan()

此方法应返回标准记录,列表或地图,具体取决于您的需求。

从这条记录中你应该能够创建合适的员工。

为此,您需要所谓的Factory类。

这是一个包含创建适当的Employee子类对象的逻辑的类。

例如:

class EmployeeFactory {

    public static Employee create(Record record) {

        if (record.get("annualSales") != null) {
            return new Salesman(record.get("name"),
                                record.get("monthlySalary"),
                                record.get("annualSales"));
        }

        if (record.get("stockPrice") != null) {
            return new Executive(record.get("name"),
                                record.get("monthlySalary"),
                                record.get("stockPrice"));
        }


       return new Employee(record.get("name"),
                           record.get("monthlySalary"));
    }
}

这可以根据需要进行改进。

答案 1 :(得分:0)

我猜输入文本文件包含行,每个行都包含一个与逗号连接的员工信息,如csv文件。

在我看来,你不应该在Employee及其子类代码中使用String#split()。读取文件成功完成后,将每一行拆分为每个属性(如name和monthlySalary),然后将它们传递给Employee或其子类的构造函数。

通过明确区分获取文件信息和制作Employee对象,Employee类成为robuster。例如,请假设创建Employee对象的信息来自另一种格式(如xml文件)?如果你在Employee的构造函数中调用String#split(),就无法轻易应对这一点!

相关问题