[Java] Metoda klasowa dla wszystkich obiektów / ekstensji

anika91
Użytkownik
Użytkownik
Posty: 172
Rejestracja: 11 paź 2009, o 19:54
Płeć: Kobieta
Lokalizacja: Gdańsk
Podziękował: 67 razy

[Java] Metoda klasowa dla wszystkich obiektów / ekstensji

Post autor: anika91 »

Mam klasę w Javie Pracownik oraz drugą klasę ObjectPlus której zadaniem jest przechowywać wszystkie ekstensje w jednym miejscu:

Kod: Zaznacz cały

public class ObjectPlus {

	private static Map<String, List<Object>> ekstensje;
	//mapa by przechowywać wszystkie obiekty
	
	
	public ObjectPlus(){ //konstruktor wywolywany gdy tworzymy nowy obiekt w klasie Pracownik
		if (ekstensje==null){
			
			ekstensje = new HashMap<String, List<Object>>();
		}
		
		String className = this.getClass().toString();
		List<Object> ekstensja = ekstensje.get(className);
		
		if(ekstensja == null){
			ekstensja = new ArrayList<Object>();
			ekstensje.put(className, ekstensja);
		}
		
		ekstensja.add(this);
	}
	
	
	//ta metoda zwróci nam ekstensje dla danego obiektu 
	public List<Object> getEkstensja(){
		
		String className = this.getClass().toString(); 
		List<Object> list = ekstensje.get(className);
		return list;
	}
	
	
//druga taka sama metoda ale bedzie przyjmowala nazwe klasy, i bedzie dzialac na metodach klasowych
public static List<Object> getEkstensja(String className){
		return ekstensje.get(className);

	}
}
Klasa Pracownik extends ObjectPlus :

W klasie pracownik mam ponadto atrybut powtarzalny , który trzyma listę miejsc pracy dla danego pracownika:

Kod: Zaznacz cały

public List<String> miejscaPracy = new ArrayList<String>();
natomiast w metodzie

Kod: Zaznacz cały

public static void main(String[] args) {
mam pętle która wypisuje dla danego pracownika listę miejsc pracy:

Kod: Zaznacz cały


        Pracownik p = new Pracownik();		
	p.miejscaPracy.add("Bytom");
	p.miejscaPracy.add("Kraków");

	for (int i=0; i< p.miejscaPracy.size(); i++){ //wypisanie miejsc pracy, druga wersja
		System.out.println(p.miejscaPracy.get(i));
	}
Chcialabym tą pętle opakować w metodę klasową która działała by dla wszystkich obiektów klasowych i była by wywoływana w sposób System.out.println(Pracownik.miejscaPracy()); i zwracała miejsca pracy dla wszystkich pracowników których utworzyliśmy i przypisaliśmy im jakieś miejsca pracy...

Dziękuje za pomoc
Ostatnio zmieniony 11 kwie 2012, o 18:52 przez Afish, łącznie zmieniany 1 raz.
Powód: Poprawa wiadomości.
pfauel
Użytkownik
Użytkownik
Posty: 32
Rejestracja: 26 lis 2009, o 01:15
Płeć: Mężczyzna
Lokalizacja: Polska
Pomógł: 9 razy

[Java] Metoda klasowa dla wszystkich obiektów / ekstensji

Post autor: pfauel »

Kod: Zaznacz cały

public static String miejscaPracy() {
   String result = "";
   List<Object> pracownicy = Pracownik.getEkstensja();
   for (Object pracownikObject : pracownicy) {
      if (pracownikObject instanceof Pracownik) {
         Pracownik pracownik = (Pracownik) pracownikObject;
         for (String miejscePracy : pracownik.miejscaPracy) {
            result = result + miejscePracy + "
";
         }
      } else {
         continue;
      }
   }
   return result;
}
Nie wywoływałem u siebie tego kodu - przepraszam jeżeli wkradły się jakieś małe błędy - ale wydaję mi się, że to powinno być wszystko. Nie napisałaś z czym konkretnie masz problem.
Kod ten umieszczasz oczywiście w klasie Pracownik.
W moim kodzie problemem pozostaje jedynie kwestia duplikatów (powtarzających się miejsc pracy) - można by je prosto wyeliminować zbierając elementy (miejsca pracy) w strukturze Set i dopiero na koniec wpisując je wszystkie w jeden String.
Mam nadzieję, że pomogłem.
pozdrawiam
Ostatnio zmieniony 12 kwie 2012, o 01:43 przez pfauel, łącznie zmieniany 1 raz.
anika91
Użytkownik
Użytkownik
Posty: 172
Rejestracja: 11 paź 2009, o 19:54
Płeć: Kobieta
Lokalizacja: Gdańsk
Podziękował: 67 razy

[Java] Metoda klasowa dla wszystkich obiektów / ekstensji

Post autor: anika91 »

może spróbuje jeszcze raz doprecyzować o co mi chodzi .

Mam klasę Pracownik i w niej atrybut:

Kod: Zaznacz cały

public List<String> miejscaPracy = new ArrayList<String>();
,który w postaci listy stringów przechowuje miejsca pracy...

W metodzie main mam wywołanie :

Kod: Zaznacz cały

public static void main(String[] args) {
		
//utworzenie 1szego obiektu :

		Pracownik p = new Pracownik();
		p.miejscaPracy.add("Bytom");
		p.miejscaPracy.add("Kraków");

//utworzenie 2giego obiektu:
                
               Pracownik p2 = new Pracownik();
               p2.miejscaPracy.add("Warszawa");
mając już utworzone jakieś obiekty i przypisane do nich miejsca pracy , chciałabym teraz mieć dwie rodzaje metod:

1. metodę klasową , która pozwalała by na wypisanie wszystkich miejsc pracy dla wszystkich obiektów utworzonych .

2. metodę zwracjącą miejsca pracy tylko dla wybranego przeze mnie obiektu czyli odpowiednio coś takiego:

Kod: Zaznacz cały

System.out.println(Pracownik.getMiejscaPracy); - zwracajaca wszystkie miejsca pracy dla obiektow
System.out.println(p.getMiejscaPracy); - zwracajaca miejsca pracy tylko dla wybranego obiektu
co do zrobienia metody klasowej, pobierającej te wszystkie ekstensje, to fragment który napisałeś działa , ja jeszcze myślałam o czymś takim: zrobienie gettera i zamienienie tej listy miejscaPracy na static :

Kod: Zaznacz cały

public static List<String> miejscaPracy = new ArrayList<String>();

//metoda
public static List<String> getMiejscaPracy() {
return miejscaPracy;
}
nie wiem niestety jeszcze jak zrobić żeby mieć jeszcze metodę zwracającą miejsca pracy tylko dla danego obiektu..

nie chce wywoływać za każdym razem w mainie pętli for :

Kod: Zaznacz cały

for (String m : p.miejscaPracy){
			
			System.out.println(m);
		}
Serdecznie dziękuje za pomoc , sama już się chyba trochę pogmatwałam ,niestety programowanie to moja pięta achillesowa...
pfauel
Użytkownik
Użytkownik
Posty: 32
Rejestracja: 26 lis 2009, o 01:15
Płeć: Mężczyzna
Lokalizacja: Polska
Pomógł: 9 razy

[Java] Metoda klasowa dla wszystkich obiektów / ekstensji

Post autor: pfauel »

Kod: Zaznacz cały

// zwracajaca wszystkie miejsca pracy dla obiektow
System.out.println(Pracownik.getMiejscaPracy()); 
 // zwracajaca miejsca pracy tylko dla wybranego obiektu
System.out.println(p.getMiejscaPracy());
To niestety w powyższej formie nie jest możliwe, ponieważ wymagało by to zdefiniowania w klasie Pracownik metody "getMiejscaPracy()" dwa razy: raz jako static raz jako nie static - to nie jest możliwe w Javie.
Nie wiem, jak jest Twoje zadanie zdefiniowane, ale najprościej oczywiście było by zmienić nazwę jednej z tych metod żeby się nie powtarzały... na przykład tak:

Kod: Zaznacz cały

// zwracajaca wszystkie miejsca pracy dla obiektow
System.out.println(Pracownik.getWszystkieMiejscaPracy()); 
 // zwracajaca miejsca pracy tylko dla wybranego obiektu
System.out.println(p.getMiejscaPracy());
Wtedy "getWszystkieMiejscaPracy()" byłaby zdefiniowana tak jak w moim poprzednim poście, natomiast "getMiejscaPracy()" można zapisać mniej więcej tak:

Kod: Zaznacz cały

public String getMiejscaPracy() {
   String result = "";
   for (String miejscePracy : this.miejscaPracy) {
      result = result + miejscePracy + "
";
   }
   return result;
}
I "List<String> miejscaPracy" jako static to nie jest raczej dobry pomysł, ponieważ tracisz informacje na temat miejsc pracy konkretnego pracownika.
No fakt - trochę zagmatwałaś Mam nadzieję, że o to chodziło.
pozdrawiam
anika91
Użytkownik
Użytkownik
Posty: 172
Rejestracja: 11 paź 2009, o 19:54
Płeć: Kobieta
Lokalizacja: Gdańsk
Podziękował: 67 razy

[Java] Metoda klasowa dla wszystkich obiektów / ekstensji

Post autor: anika91 »

serdecznie dziękuje za pomoc .

Ale mam jeszcze jedno pytanie... jak przerobić tą metodę:

Kod: Zaznacz cały

public static String miejscaPracy() {
   String result = "";
   List<Object> pracownicy = Pracownik.getEkstensja();
   for (Object pracownikObject : pracownicy) {
      if (pracownikObject instanceof Pracownik) {
         Pracownik pracownik = (Pracownik) pracownikObject;
         for (String miejscePracy : pracownik.miejscaPracy) {
            result = result + miejscePracy + "
";
         }
      } else {
         continue;
      }
   }
   return result;
}
żeby umieścić ją w klasie abstrakcyjnej Pracownik , po której dziedziczą dwie podklasy Handlowiec i Serwisant ??

Chciałabym zrobić tak że w klasie Serwisant tworzę np. nowy obiekt i dla niego wywołuję metodę getWszystkieMiejscaPracy i analogicznie dla klasy Handlowiec... w tej chwili to nie działa, musiała bym tą metodę powielać w każdej z tych klas i pozmieniać odpowiednio nazwy pól dla każdej z klas...

Wszystko przez to że w klasę Pracownik zmieniłam na abstrakcyjną i nie mogę w niej tworzyć obiektów klasy pracownik....
ODPOWIEDZ