Jak sprawdzić czy obiekt zostać już utworzony?

Odpowiedz Nowy wątek
2014-12-18 21:10
0

Witam forumowiczow,
mam maly problem i nie bardzo wiem jak sie za temat zabrac (prosze o podpowiedz nie rozwiazanie).. Mianowicie musze zdefiniowac klasę Fabryka implementującą statyczną metodę make. Metoda ta będzie przyjmować jako parametr wartość typu int określającą jaki rodzaj cukierków należy produkować, a zwracać obiekt reprezentujący ten cukierek. Jeżeli cukierek określonego typu był już produkowany w tej fabryce, należy zwrócić jego obiekt. W przeciwnym przypadku metoda make poprzedzi zwrócenie obiektu jego fabrykacją.
Utworzylem taka klase:

class Fabryka
{
    int[] rodzaje = new int[5];
    static Cukierek make(int rodzaj)
    {
        switch (rodzaj)
        {
            case 1: 
            Cukierek rodzaj1 = new Cukierek("truskawkowy");
            return rodzaj1;
            case 2: Cukierek rodzaj2 = new Cukierek("brzoskwiniowy");
            return rodzaj2;
            case 3: Cukierek rodzaj3 = new Cukierek("wisniowy");
            return rodzaj3;
            case 4: Cukierek rodzaj4 = new Cukierek("malinowy");
            return rodzaj4;
            case 5: Cukierek rodzaj5 = new Cukierek("bananowy");
            return rodzaj5;
            default: System.out.println("Wybierz rodzaj cukierka od 0 do 5");
            return null;
        }
    }
}

Z tego co wiem nie ma mozliwosci sprawdzenia czy dany obiekt istnieje, przynajmniej nie znalazlem zadnych informacji na ten temat. Pomyslalem wiec ze bede zapisywal wszystkie tworzone typy cukierkow w tablicy lecz nawet jesli natrafie na utworzony wczesniej cukierek nie moge go zwrocic poniewaz kompilator karze mi go najpierw utworzyc..
Kolejnym problemem jest to, ze nie skorzystac z cukierka utworzonego przez metode make w metodzie main

Fabryka.make(3);
rodzaj1.show();

rodzaj1 cannot be resolved

edytowany 1x, ostatnio: furious programming, 2014-12-18 23:17
jako parametr wartość typu int określającą jaki rodzaj cukierków należy produkować ale idiotyczne zadanie. to powinen być enum albo string - karolinaa 2014-12-18 22:16

Pozostało 580 znaków

2014-12-18 21:27
2
  1. http://en.wikipedia.org/wiki/Flyweight_pattern
  2. Ty sobie robisz jaja? WTF?
    Cukierek rodzaj1 = Fabryka.make(3);
    rodzaj1.show();

Na PW przyjmuje tylko (ciekawe!) zlecenia. Masz problem? Pisz na forum, nie do mnie.
edytowany 1x, ostatnio: Shalom, 2014-12-18 21:28

Pozostało 580 znaków

2014-12-18 21:35
0

Skad wzales

Cukierek rodzaj1 = Fabryka.make(3);

i co jest nie tak z

rodzaj1.show();

rodzaj1 to utworzony obiekt klasy cukierek a show() to metoda tej klasy

edytowany 1x, ostatnio: kamilk007, 2014-12-18 21:38

Pozostało 580 znaków

2014-12-18 21:39
2

Chłopie, weź ty do ręki jakiś kurs z podstawami programowania bo co to robisz to jest jakiś WTF. Chcesz pisać fabrykę obiektów a nie rozumiesz jak sie wywołuje metody? o_O Przecież twoja metoda make coś ZWRACA. Jak chcesz cokolwiek zrobić z tym zwróconym obiektem to musisz go do czegoś PRZYPISAĆ.


Na PW przyjmuje tylko (ciekawe!) zlecenia. Masz problem? Pisz na forum, nie do mnie.
2014-12-20 12:50
0

Ja to zrobiłem w ten sposób:

public class Fabryka{
    static Cukierek [] cukierki = new Cukierek [5];
 
    public static Cukierek make(int rodzaj){
         switch (rodzaj)
            {
                case 1:
                    if(cukierki[0]==null){
                    Cukierek rodzaj1 = new Cukierek("waniliowy", 50);
                    cukierki[0] = rodzaj1;
                    }
                return cukierki[0];
                case 2:
                    if(cukierki[1]==null){
                        Cukierek rodzaj2 = new Cukierek("kokosowy", 50);
                        cukierki[1] = rodzaj2;
                        }
                return cukierki[1];
                case 3:
                    if(cukierki[2]==null){
                        Cukierek rodzaj3 = new Cukierek("wisniowy", 50);
                        cukierki[2] = rodzaj3;
                        }
                return cukierki[2];
                case 4:
                    if(cukierki[3]==null){
                        Cukierek rodzaj4 = new Cukierek("malinowy", 50);
                        cukierki[3] = rodzaj4;
                        }               
                return cukierki[3];
                case 5:
                    if(cukierki[4]==null){
                        Cukierek rodzaj5 = new Cukierek("bananowy", 50);
                        cukierki[4] = rodzaj5;
                        }
                return cukierki[4];
                default: System.out.println("Wybierz rodzaj cukierka od 0 do 5");
                return null;
            }
    }
}

Żeby później skorzystać z tych cukierków to musisz je gdzieś przechować tak jak kolega powiedział. Więc tworzysz tablicę obiektów (klasa Cukierek, przygotowywałeś ją we wcześniejszym zadaniu - tak mam te same). Pole int jest tutaj zbędne.

Żeby sprawdzić, czy dany cukierek już był produkowany po prostu robisz warunek taki jak w załączonym kodzie, który sprawdza czy dany element tablicy ma wartość null. Jeżeli tak to znaczy że cukierek nie był produkowany i fabrykujemy obiekt, a jeżeli nie no to zwraca Ci odp. element tablicy, który zawiera ten cukierek.

Proszę się nie czepiać za jakieś błędy logiczne mojej wypowiedzi, ale też dopiero zaczynam i starałem się +- wytłumaczyć mój tok myślenia.

Później żeby skorzystać z tego działasz na zasadzie:

Fabryka.make(3);
Fabryka.cukierki[2].show();
 

i powinno działać

Założenia zadania są jakie są, dlatego taki kod powstał, a nie inny. A czego mam się wstydzić? Jestem przekonany, że mój post bardziej mu pomógł niż Twoje wywyższanie się. Zapomniał wół, jak cielęciem był.


„Every Pro was once an amateur, every expert was once a beginner.”
Serio, nie wstydzisz się czegoś takiego pokazać? o_O A jakby cukierów mogło być milion to też byś tak zrobił? Albo jak byś chciał żeby użytkownik mógł sam podać "parametry" cukierka, a fabryka miałaby tylko kontrolować czy aby czasem cukierek o takich samych parametrach nie był już utworzony? ;] - Shalom 2014-12-20 13:20
Ale niby w czym mu pomógł? o_O Jeśli on zapamięta cokolwiek z twojego postu to będzie to ze szkodą dla niego, bo twoje rozwiązanie jest zwyczajnie nie-eleganckie i w ogólnym przypadku po prostu złe. I nie tłumacz się że "działa", bo akurat to jest najmniej istotna sprawa. - Shalom 2014-12-20 13:32
@Shalom - czyżby jeden komentarz znikł? Teraz wygląda to tak, jakbyś odpowiadał sam sobie; - furious programming 2014-12-20 23:26
Nie znikł, ale scaliłem kilka postów pod rząd ;] - Shalom 2014-12-21 00:01

Pozostało 580 znaków

2014-12-29 16:19
0

Witam kolegów z uczelni ;)

Moje rozwiązanie wygląda następująco:

public class Fabryka {
 
    static String[] rodzaje = {
        "gorzki",
        "słodki",
        "kwaśny",
    };
 
    static Cukierek[] cukierki = new Cukierek[rodzaje.length];
 
    public static Cukierek make(int rodzaj) {
        if(rodzaj >= rodzaje.length)
            return null;
 
        if(rodzaje[rodzaj] == null)
            return null;
 
        if(cukierki[rodzaj] == null)
            cukierki[rodzaj] = new Cukierek(rodzaje[rodzaj], 1);
 
        return cukierki[rodzaj];
    }
 
}

Prosiłbym jakiegoś doświadczonego programistę o opinię ;)

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0