PROJECTO EMPREGADOS Os empregados de uma empresa são caracterizados pela seguinte informação: código, nome e dias de trabalho efectivos no mês. Todos os empregados normais possuem um salário-dia fixo. No entanto, os gestores têm um prémio de gestão que multiplica o seu vencimento normal (exº 1.25). Os motoristas, têm definido um valor por Km percorrido, e têm a si associado o número de Kms percorridos nesse mês para cálculo do seu salário final. Criar uma classe EmpresaList que represente a lista de todos os empregados da empresa, e tenha implementados, para além dos métodos usuais, os seguintes métodos: Verificar se um empregado de código dado existe; Devolver a ficha de um empregado dado o seu código; Inserir um novo empregado; Devolver uma cópia da lista de empregados; Inserir todos os empregados de um conjunto dado; Calcular o total de salários a pagar; Calcular o número total de gestores da empresa; Calcular o total de empregados do tipo dado como String; Calcular o total de Kms percorridos pelos motoristas; Gravar a instância num ficheiro de texto; Gravar a instância num ficheiro de objectos; Criar uma classe EmpresaMap com os mesmos requisitos mas usando TreeMap<String, Empregado>. Criar uma classe EmpresaSet com os mesmos requisitos mas usando TreeSet<Empregado>, e um Comparator<Empregado> que permirá que os empregados sejam ordenados segundo uma ordem dada.
DIAGRAMA DE CLASSES DO PROJECTO NOTA: Esta solução é a solução normalizada em termos de polimorfismo, porque usa uma classe abstracta para o tipo Empregado e define 3 subtipos concretos, designadamente Normal, Motorista e Gestor. É usada na classe Empregado uma variável de classe que corresponde ao valor do salário diário, dado que tal valor deve ser comum a todos os empregados, um método que permite mudar este valor e outro que permite consultá-lo.
/** * Abstract class Empregado */ import java.io.*; public abstract class Empregado implements Serializable{ // Definições de classe private static double saldia = 50.00; public static double getsaldia() { return saldia; public static void setsaldia(double nvsaldia) { saldia = nvsaldia; public Empregado(String cod, String nom, int dias) { codigo = cod; nome = nom; this.dias = dias; public Empregado(Empregado emp) { codigo = emp.getcodigo(); nome = emp.getnome(); dias = emp.getdias(); // variáveis de instância private String codigo; private String nome; private int dias; // métodos de instância public String getnome() { return nome; public String getcodigo() { return codigo; public int getdias() { return dias; public boolean equals(object obj) { if(this == obj) return true; if((obj == null) (this.getclass()!= obj.getclass())) return false; Empregado e = (Empregado) obj; return nome.equals(e.getnome()) && codigo.equals(e.getcodigo()) && dias == e.getdias(); // abstractos public abstract double salario(); public abstract String tostring(); public abstract Empregado clone();
/** Normal < Empregado */ public class Normal extends Empregado { public Normal(String cod, String nom, int dias) { super(cod, nom, dias); public Normal(Normal func) { super(func); // Métodos de Instância public double salario() { return this.getdias()*getsaldia(); public String tostring() { return "Normal: " + this.getnome() + " - " + this.getcodigo() + " - " + this.salario(); public Normal clone() { return new Normal(this); /** Gestor < Empregado */ public class Gestor extends Empregado { public Gestor(String cod, String nom, int dias, double prem) { super(cod, nom, dias); premio = prem; public Gestor(Gestor gest) { super(gest); premio = gest.getpremio(); // variáveis de instância private double premio; // Métodos de instância public double getpremio() { return premio; // Implementação dos abstractos public double salario() { return this.getdias()*getsaldia()*premio; public String tostring() { return "Gestor: " + this.getnome() + " - " + this.getcodigo() + " - " + this.salario(); public boolean equals(object g) { return super.equals(g) && premio == ((Gestor) g).getpremio(); public Gestor clone() { return new Gestor(this);
/** Motorista < Empregado. */ public class Motorista extends Empregado { private static double valorkm = 0.002; public static void mudavalorkm(double nvvalkm) { valorkm = nvvalkm; public Motorista(String cod, String nom, int dias, double kms) { super(cod, nom, dias); kiloms = kms; public Motorista(Motorista motor) { super(motor); kiloms = motor.getkms(); // Vars de instância private double kiloms; // Métodos de instância public double getkms() { return kiloms; public void setkms(double kms) { kiloms = kms; // Implementação dos abstractos public double salario() { return this.getdias()*getsaldia()*(kiloms*valorkm); public String tostring() { return "Motorista: " + this.getnome() + " - " + this.getcodigo() + " - " + this.salario(); public boolean equals(object m) { return super.equals(m) && kiloms == ((Motorista) m).getkms(); public Motorista clone() { return new Motorista(this);
/** * EmpresaList: Uma Lista de Empregado. * * @author F. Mário Martins * @version 1/2007 */ import java.util.*; import java.io.*; public class EmpresaList implements Serializable { // variáveis de instância private ArrayList<Empregado> emps = new ArrayList<Empregado>(); public EmpresaList() { emps = new ArrayList<Empregado>(); public EmpresaList(ArrayList<Empregado> lstemp) { for(empregado emp : lstemp) emps.add(emp.clone()); public EmpresaList(EmpresaList le) { List<Empregado> aux = le.dalista(); for(empregado emp : aux) emps.add(emp); // Métodos de Instância public void insereemp(empregado emp) { emps.add(emp.clone()); public boolean existeemp(string cod) { boolean existe = false; Iterator<Empregado> itemp = emps.iterator(); while(itemp.hasnext() &&!existe) { if(itemp.next().getcodigo().equals(cod)) existe = true; return existe; public void insereempregados(collection<? extends Empregado> lstemp) { for(empregado emp : lstemp) emps.add(emp.clone());
public void juntaempregados(collection<empregado> lstemp) { for(empregado emp : lstemp) emps.add(emp.clone()); public Empregado dafichaemp(string cod) { boolean existe = false; Empregado emp = null; Iterator<Empregado> itemp = emps.iterator(); while(itemp.hasnext() &&!existe) { emp = itemp.next(); if(emp.getcodigo().equals(cod)) existe = true; return existe? emp.clone() : null; public List<Empregado> dalista() { ArrayList<Empregado> aux = new ArrayList<Empregado>(); for(empregado emp : emps) aux.add(emp.clone()); return aux; public double totalsalarios() { double total = 0.0; for(empregado emp : emps) total += emp.salario(); return total; public int totalgestores() { int total = 0; for(empregado emp : emps) if(emp instanceof Gestor) total++; return total; public int totalde(string Tipo) { int total = 0; for(empregado emp : emps) if(emp.getclass().getname().equals(tipo)) total++; return total;
public double totalkms() { double totalkm = 0.0; for(empregado emp : emps) if(emp instanceof Motorista) totalkm += ((Motorista) emp).getkms(); return totalkm; public String tostring() { StringBuilder sb = new StringBuilder("--- Empregados ---\n"); for(empregado emp : emps) sb.append(emp.tostring() + "\n"); return sb.tostring(); // Métodos a explicar posteriormente public void gravaobj(string fich) throws IOException { ObjectOutputStream oos = new ObjectOutputStream( new FileOutputStream(fich)); oos.writeobject(this); oos.flush(); oos.close(); public void gravatxt(string fich) throws IOException { PrintWriter pw = new PrintWriter(fich); pw.print(this); pw.flush(); pw.close();
/** * TesteEmpresaList: teste de ArrayList<Empregado>. * @author F. Mário Martins * @version 1/2007 */ import static java.lang.system.out; import java.io.*; public class TesteEmpresaList { public static EmpresaList main() { Motorista mt1 = new Motorista("M10", "Rui", 20, 1000); Motorista mt2 = new Motorista("M12", "Luis", 22, 1200); Gestor g1 = new Gestor("G1", "Manuel", 22, 1.5); Gestor g2 = new Gestor("G2", "Joel", 22, 1.5); Normal n1 = new Normal("N1", "Vasco", 25); Normal n2 = new Normal("N22", "Maria", 20); Normal n3 = new Normal("N25", "Laura", 21); EmpresaList lstemp = new EmpresaList(); lstemp.insereemp(mt1); lstemp.insereemp(mt2); lstemp.insereemp(g1); lstemp.insereemp(g2); lstemp.insereemp(n1); lstemp.insereemp(n2); lstemp.insereemp(n3); out.println(lstemp.tostring()); // terminal window // código a explicar posteriormente try { lstemp.gravaobj("emp1.obj"); lstemp.gravatxt("emp1.txt"); catch(ioexception e) { out.println(e.getmessage()); EmpresaList lstemps1 = new EmpresaList(); // lê da ObjectStream a instância anteriormente gravada!! try { ObjectInputStream ooin = new ObjectInputStream(new FileInputStream("emp1.obj")); lstemps1 = (EmpresaList) ooin.readobject(); ooin.close(); catch(ioexception e) { catch(classnotfoundexception ec) {; return lstemps1;