Witam,
Mam problem z częścią kodu, w którym staram się przeiterować po hashtbale:
Hashtable<Class<? extends ObjectPlus>, Vector<ObjectPlus>> ekstensje = new Hashtable<>();
w taki sposób, aby dla móc globalnie dla każdej obiektu z wszystkich klas, które znajdują się w ekstensji, zmienić pensje metodą:
public void setPensja(double nowaPensja) {
this.pensja = nowaPensja;
}
Poniżej załączam cały kod programu:
Klasa Pracownik:
import java.util.*;
public abstract class Pracownik extends ObjectPlus{
private static final long serialVersionUID = 1L;
private static ArrayList<Pracownik> pracownicy = new ArrayList<>();
public Pracownik(){}
// atrybut prosty, wymagany, pojedynczy, obiektu
protected String imie;
// atrybut prosty, wymagany, pojedynczy, obiektu
protected String nazwisko;
// atrybut prosty, wymagany, pojedynczy, obiektu
protected String pesel;
// atrybut złożony, wymagany, pojedynczy, obiektu
protected Date dataurodzenia;
// atrybut prosty, wymagany, pojedynczy, obiektu
protected String numerKontaBankowego;
// atrybut prosty, wymagany, pojedynczy, obiektu
protected String ulica;
// atrybut prosty, wymagany, pojedynczy, obiektu
protected int numerDomu;
// atrybut prosty, opcjonalny, pojedynczy, obiektu
protected int numerMieszkania;
// atrybut prosty, wymagany, pojedynczy, obiektu
protected String miejscowosc;
// atrybut prosty, wymagany, pojedynczy, obiektu
protected String kodPocztowy;
// atrybut prosty, wymagany, pojedynczy, obiektu
protected String telefonKontaktowy;
// atrybut złożony, wymagany, pojedynczy, obiektu,
protected Date dataRozpoczeciaWspolpracy;
// atrybut złożony, opcjonalny, pojedynczy, obiektu,
protected Date dataZakonczeniaWspolpracy;
// atrybut prosty, wymagany, pojedynczy, obiektu
protected double pensja;
// atrybut prosty, opcjonalny, wyliczalny, pojedynczy, obiektu
protected double premia;
// atrybut klasowy
protected static String adresFirmy;
Pracownik(String imiePracownika, String nazwiskoPracownika, String peselPracownika, Date dataUrodzeniaPracownika,
String numerKontaBankowegoPracownika, String ulicaPracownika, int numerDomuPracownika,
String miejscowoscPracownika, String kodPocztowyPracownika, String telefonKontaktowyPracownika,
Date dataRozpoczeciaWspolpracyPracownika, double pensjaPracownika)
{
super();
dodajPracownik(this);
/**
* każdy z wymaganych atrybutów musi zostać
* podany podczas tworzenia pracownika
*/
if(imiePracownika == null)
{
throw new NullPointerException("Proszę podać Imię Pracownika");
}
if(nazwiskoPracownika == null)
{
throw new NullPointerException("Proszę podać Nazwisko Pracownika");
}
if(peselPracownika == null)
{
throw new NullPointerException("Proszę podać PESEL Pracownika");
}
if(dataUrodzeniaPracownika == null)
{
throw new NullPointerException("Proszę podać datę urodzenia Pracownika");
}
if(numerKontaBankowegoPracownika == null)
{
throw new NullPointerException("Proszę podać nr konta Pracownika");
}
if(ulicaPracownika == null)
{
throw new NullPointerException("Proszę podać ulicę zamieszkania Pracownika");
}
if(numerDomuPracownika == 0)
{
throw new NullPointerException("Proszę podać numer domu Pracownika");
}
if(miejscowoscPracownika == null)
{
throw new NullPointerException("Proszę podać miejscowość Pracownika");
}
if(kodPocztowyPracownika == null)
{
throw new NullPointerException("Proszę podać kod pocztowy Pracownika");
}
if(telefonKontaktowyPracownika == null)
{
throw new NullPointerException("Proszę podać telefon kontaktowy Pracownika");
}
if(dataRozpoczeciaWspolpracyPracownika == null)
{
throw new NullPointerException("Proszę podać datę rozpoczęcia współpracy Pracownika");
}
if(pensjaPracownika == 0)
{
throw new NullPointerException("Proszę podać wysokość pensji Pracownika");
}
this.imie = imiePracownika;
this.nazwisko = nazwiskoPracownika;
this.pesel = peselPracownika;
this.dataurodzenia = dataUrodzeniaPracownika;
this.numerKontaBankowego = numerKontaBankowegoPracownika;
this.ulica = ulicaPracownika;
this.numerDomu = numerDomuPracownika;
this.miejscowosc = miejscowoscPracownika;
this.kodPocztowy = kodPocztowyPracownika;
this.telefonKontaktowy = telefonKontaktowyPracownika;
this.dataRozpoczeciaWspolpracy = dataRozpoczeciaWspolpracyPracownika;
this.pensja = pensjaPracownika;
this.adresFirmy = "ul. Krucza 24, 01-423 Warszawa";
}
/**
* uzupełenienie obiektu pracownik o atrybuty opcjonalne
*/
public void wstawNumerMieszkaniaPracownika(int numerMieszkaniaPracownika){
this.numerMieszkania = numerMieszkaniaPracownika;
}
public void wstawDateZakonczeniaWspolpracy(Date dataZakonczeniaWspolpracyPracownika)
{
this.dataZakonczeniaWspolpracy = dataZakonczeniaWspolpracyPracownika;
}
public String getImie()
{
return this.imie;
}
/**
* METODA KLASOWA:
* modyfikacja pensji pracowników o podaną wartość (w procentach)
*/
public static void podwyzka(double wysokoscPodwyzki) throws Exception {
// Dla każdego pracownika w ekstensji
if (wysokoscPodwyzki < 0.01 || wysokoscPodwyzki > 0.1){
throw new Exception("Podwyżka pensji dla wszystkich pracowników musi mieścić się w przedzialę miedzy 1% a 10%");
}
for(Pracownik pracownik : pracownicy)
{
pracownik.setPensja((1 + wysokoscPodwyzki) * pracownik.getPensja());
}
}
public double getPensja() {
return pensja;
}
public void setPensja(double nowaPensja) {
this.pensja = nowaPensja;
}
/**
* METODA POLIMORFICZNA, ABSTRAKCYJNA:
*/
abstract void obliczWysokoscPremii();
public double getPremia() {
return premia;
}
public void setPremia(double wysokoscPremii) {
this.premia = wysokoscPremii;
}
/**
* przesloniecie metody "toString()"
*/
public String toString(){
String pracownik = new String();
pracownik += "Imię: "+this.imie;
pracownik += "\nNazwisko: " + this.nazwisko;
pracownik += "\nPESEL: "+ this.pesel;
pracownik += "\nAdres: "+ this.ulica + " " + this.numerDomu + "/" + this.numerMieszkania;
pracownik += "\n\t " + this.kodPocztowy + " " + this.miejscowosc;
pracownik += "\nPensja: " + this.getPensja();
pracownik += "\nPremia: " + this.getPremia();
pracownik += "\n\nData zatrudnienia: " + this.dataRozpoczeciaWspolpracy;
pracownik += "\nAdres firmy: " + this.adresFirmy;
return pracownik;
}
private static void dodajPracownik(Pracownik pracownik) {
pracownicy.add(pracownik);
}
private static void usunPracownik(Pracownik pracownik){
pracownicy.remove(pracownik);
}
}
Klasa Przewodnik:
import java.util.Date;
public class Przewodnik extends Pracownik{
private static final long serialVersionUID = 1L;
Przewodnik(String imiePracownika, String nazwiskoPracownika, String peselPracownika, Date dataUrodzeniaPracownika,
String numerKontaBankowegoPracownika, String ulicaPracownika, int numerDomuPracownika,
String miejscowoscPracownika, String kodPocztowyPracownika, String telefonKontaktowyPracownika,
Date dataRozpoczeciaWspolpracyPracownika, double pensjaPracownika) {
super(imiePracownika, nazwiskoPracownika, peselPracownika, dataUrodzeniaPracownika, numerKontaBankowegoPracownika,
ulicaPracownika, numerDomuPracownika, miejscowoscPracownika, kodPocztowyPracownika, telefonKontaktowyPracownika,
dataRozpoczeciaWspolpracyPracownika, pensjaPracownika);
}
protected int iloscOprowadzonychWystaw;
public double getIloscOprowadzonychWystaw() {
return iloscOprowadzonychWystaw;
}
public void setIloscOprowadzonychWystaw(int liczbaOprowadzen) {
this.iloscOprowadzonychWystaw = liczbaOprowadzen;
}
/**
* POLIMORFIZM METODY
*/
@Override
void obliczWysokoscPremii()
{
this.setPremia(this.iloscOprowadzonychWystaw * 25.00);
}
}
Klasa Renowator:
import java.util.*;
public class Renowator extends Pracownik{
private static final long serialVersionUID = 1L;
Renowator(String imiePracownika, String nazwiskoPracownika, String peselPracownika, Date dataUrodzeniaPracownika,
String numerKontaBankowegoPracownika, String ulicaPracownika, int numerDomuPracownika,
String miejscowoscPracownika, String kodPocztowyPracownika, String telefonKontaktowyPracownika,
Date dataRozpoczeciaWspolpracyPracownika, double pensjaPracownika) {
super(imiePracownika, nazwiskoPracownika, peselPracownika, dataUrodzeniaPracownika, numerKontaBankowegoPracownika,
ulicaPracownika, numerDomuPracownika, miejscowoscPracownika, kodPocztowyPracownika, telefonKontaktowyPracownika,
dataRozpoczeciaWspolpracyPracownika, pensjaPracownika);
}
/**
* Atrybut prosty, powtarzalny, obiektu
*/
protected List<Double> ocenyZaRenowacje = new ArrayList<>();
public double getSredniaOcen(List<Double> oceny) {
Double suma = 0.00;
if(!oceny.isEmpty()) {
for (Double ocena : oceny) {
suma += ocena;
}
return suma.doubleValue() / oceny.size();
}
return suma;
}
/**
* PRZECIAZANIE METODY:
*/
public void dodajOceneZaRenowacje(double ocena) throws Exception
{
if(ocena < 2 || ocena > 5)
{
throw new Exception("Podaj ocenę z przedziału 1, a 5");
}
ocenyZaRenowacje.add(ocena);
}
public void dodajOceneZaRenowacje(int ocena) throws Exception
{
if(ocena < 2 || ocena > 5)
{
throw new Exception("Podaj ocenę z przedziału 1, a 5");
}
ocenyZaRenowacje.add((double) ocena);
}
/**
* POLIMORFIZM METODY
*/
@Override
void obliczWysokoscPremii()
{
double srednia = this.getSredniaOcen(this.ocenyZaRenowacje);
int waga = 0;
int liczbaRenowacji = this.ocenyZaRenowacje.size();
if (srednia <= 3)
waga = 0;
else if (srednia > 3 && srednia <= 4)
waga = 1;
else if (srednia > 4)
waga = 2;
this.setPremia(liczbaRenowacji * 20.00 * waga);
}
}
Klasa ObjectPlus:
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.Hashtable;
import java.util.Vector;
public class ObjectPlus implements Serializable{
private static final long serialVersionUID = 1L;
protected static Hashtable<Class<? extends ObjectPlus>, Vector<ObjectPlus>> ekstensje = new Hashtable<>();
public ObjectPlus()
{
Vector<ObjectPlus> ekstensja = null;
Class<? extends ObjectPlus> klasa = this.getClass();
//sprawdzam czy dana klasa istnieje w kolekcji ekstensji
//jeśli jest, to ją wyciągam...
if(ekstensje.containsKey(klasa))
{
ekstensja = ekstensje.get(klasa);
}
else
{
//jeśli nie ma, to dodaję nową klasę do kolekcji ekstensji
ekstensja = new Vector<ObjectPlus>();
ekstensje.put(klasa, ekstensja);
}
//dodaję do wyciągniętej z ekstensji klasy nowy obiekt danej klasy
ekstensja.add(this);
}
// zapis wszystkich ekstensji do podanego strumienia (zgodność z numerem serializacji)
public static void zapiszEkstensje(ObjectOutputStream stream) throws IOException
{
//zapis ekstensji w formie tekstu
stream.writeObject(ekstensje);
}
//odczyt wszystkich ekstensji z podanego strumienia (zgodność z numerem serializacji)
public static void odczytajEkstensje(ObjectInputStream stream) throws IOException, ClassNotFoundException
{
//odtworzenia danych z tekstu
ekstensje = (Hashtable<Class<? extends ObjectPlus>, Vector<ObjectPlus>>) stream.readObject();
}
//wyświetlenie ekstensji
public static void pokazEkstensje(Class<? extends ObjectPlus> klasa) throws Exception
{
Vector<ObjectPlus> ekstensja = null;
if(ekstensje.containsKey(klasa))
{
// Ekstensja tej klasy istnieje w kolekcji ekstensji
ekstensja = ekstensje.get(klasa);
}
else
{
throw new Exception("Nieznana klasa " + klasa);
}
System.out.println("Ekstensja klasy: " + klasa.getSimpleName());
for(Object obiekt : ekstensja)
{
System.out.println(obiekt + "\n\n");
}
}
}
Klasa Main:
import java.io.*;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
public class Main {
public static void main (String args[]) throws Exception{
final String stream = "...";
Date date = new Date();
//stworzenie obiektu klasy Przewodnik
Przewodnik przewodnik = new Przewodnik("Halina", "Kowalska",
"02020202020", date, "PL00 1111-2222-3333-4444-5555-6666",
"Aleje Jerozolimskie", 61, "Warszawa",
"00-697", "500-500-500", date, 5000.00);
//dodwanie atrybutu opcjonalnego "numerMieszkania"
przewodnik.wstawNumerMieszkaniaPracownika(10);
//dodanie atrybutu obiektu "iloscOprowadzonychWystaw"
przewodnik.setIloscOprowadzonychWystaw(10);
//uzycie metody abstrakcyjnej
przewodnik.obliczWysokoscPremii();
//stworzenie obiektu klasy Renowator
Renowator renowator = new Renowator("Janusz", "Kowalski",
"01010100000", date, "PL01 1111-2222-3333-4444-5555-6666",
"Polnej Szosy", 1, "Warszawa", "00-001",
"600-600-600", date, 4500.00);
/**
//dodwanie atrybutu opcjonalnego "numerMieszkania"
renowator.wstawNumerMieszkaniaPracownika(23);
//uzycie metody przeciążonej "dodajOceneZaRenowacje()"
renowator.dodajOceneZaRenowacje(2);
renowator.dodajOceneZaRenowacje(3);
renowator.dodajOceneZaRenowacje(3.3);
renowator.dodajOceneZaRenowacje(4.5);
renowator.dodajOceneZaRenowacje(5);
//wyliczenie sredniej z ocen
renowator.getSredniaOcen(renowator.ocenyZaRenowacje);
//uzycie metody abstrakcyjnej
renowator.obliczWysokoscPremii();
Pracownik.podwyzka(0.1);
*/
// odczyt ekstensji z pliku
try {
FileInputStream fileIn = new FileInputStream(stream);
ObjectInputStream inputStream = new ObjectInputStream(fileIn);
ObjectPlus.odczytajEkstensje(inputStream);
}
catch(IOException e)
{
e.printStackTrace();
}
// wyswietlenie wszystkich dodanych pracownikow z danej klasy
ObjectPlus.pokazEkstensje(Przewodnik.class);
ObjectPlus.pokazEkstensje(Renowator.class);
//zapis ekstensji do pliku
try
{
//wskazanie sciezki do pliku
FileOutputStream fileOut = new FileOutputStream(stream);
ObjectOutputStream outStream = new ObjectOutputStream(fileOut);
//zapis do pliku
ObjectPlus.zapiszEkstensje(outStream);
outStream.close();
fileOut.close();
}
catch(IOException e)
{
e.printStackTrace();
}
}
}
Na chwilę obecną rozwiązałem problem poprzez dodanie w klasie Pracownik nowej tablicy, do której dodatkowo dodaje utworzone obiekty klas Przewodnik i Renowator, a następnie w mainie wywołuję:
public static void podwyzka(double wysokoscPodwyzki) throws Exception {
// Dla każdego pracownika w ekstensji
if (wysokoscPodwyzki < 0.01 || wysokoscPodwyzki > 0.1){
throw new Exception("Podwyżka pensji dla wszystkich pracowników musi mieścić się w przedzialę miedzy 1% a 10%");
}
for(Pracownik pracownik : pracownicy)
{
pracownik.setPensja((1 + wysokoscPodwyzki) * pracownik.getPensja());
}
}
ale z pewnością jest to bez sensu skoro na pewno da się normalnie przelecieć przez wszystkie obiekty z hastbale.
Problem tylko polega na tym, że nie wiem jak...
Początkowo próbowałem w ten sposób:
public void raise(double nowaPensja){
Set<Class<? extends ObjectPlus>> keys = extensions.keySet();
for (Class<? extends ObjectPlus> key : keys){
extensions.get(key).setPensja(nowaPensja);
}
}
ale oczywiście bez skutku.