problem z webservice

0

Witam!
Mam nastepujacy problem:
Mam webservice ktory uruchamia metody innej klasy np:

public ArrayList<String> loadProfiles() {
return m.loadProfiles();
}

gdzie w miejsce m nalezaloby wstawic obiekt klasy z ktorej uruchamiam metode...
Mam tylko problem jak to zrobic...
Nie moge utworzyc obiektu tej klasy operatorem new poniewaz jej konstruktor zawiera cala skomplikowana procedure inicjalizacji calej aplikacji a tu nie chce tego robic poniewaz wtedy przy kazdym wywolaniu metody webservice musialbym tworzyc nowa instancje tamtej klasy... Z drugiej strony nie moge po prostu napisac w atrybutach
Klasa m;
poniewaz klasa ta zawiera pola wypelnianie podczas inicjalizacji...
Czy mozna jakos do webservice przekazac referencje do juz stworzonego wczesniej obiektu tamtej klasy? Albo jak to zrobic inaczej?

I jeszcze jedno... jak zrobic zeby po wystartowaniu serwera Java automatycznie uruchamiana byla metoda main() z zadanej klasy?

Prosze o odp
Pozdrawiam
Rafał

0

Są trzy możliwości:

  1. metody statyczne
    public static metoda(){
        System.out.println("Metoda");
    }

Nie musisz tworzyć obiektu tej klasy. Wywołujesz M.metoda();

  1. Singleton za pomocą obiektu statycznego
public class M {
    
    public static M m = new M();
    
    public void metoda(){ //nie musi być statyczna
        System.out.println("Metoda");
    }
        
    public M() {
        System.out.println("Konstruktor");
    }
}

Od razu przy uruchomieniu zostanie stworzony obiekt public static M m, odwołujesz się później do metod w taki sposób: M.m.metoda();

  1. Singleton, trochę inaczej(lepiej)
    Tutaj obiekt klasy M zostanie stworzony przy pierwszym wywołaniu getM()
public class M {
    
    public static M m = null;
    
    public static M getM(){
        if (m == null) m = new M();
        return m;
    }
    
    public void metoda(){
        System.out.println("Metoda");
    }
        
    public M() {
        System.out.println("Konstruktor");
    }
}

Później odwołujesz się do obiektu w taki sposób:
M.getM().metoda();

Metody 1. użyj gdy w ogóle nie potrzebujesz instancji klasy M, metody 2. gdy chcesz aby obiekt klasy M był tylko jeden i był tworzony na starcie, natomiast metody 3 gdy chcesz mieć co najwyżej jedną instancję obiektu.

0

tylko ze ostatnia metoda jest niebezpieczna dla watkow.
trzeba uzyc podwojnego sprawdzania i synchronizacji

pozdrawiam

0

Racja, ale wystarczy dodać synchronized do getM().
Oczywiście zakładam, że dostąp do m jest tylko przez getM().
Podwójne sprawdzanie?

Jeszcze drobny szczególik. W metodzie 3. m powinno być prywatne, nie publiczne.

public class M {
   
    private static M m = null; //private
   
    public synchronized static M getM(){ //synchronized
        if (m == null) m = new M();
        return m;
    }
   
    public void metoda(){
        System.out.println("Metoda");
    }
       
    public M() {
        System.out.println("Konstruktor");
    }
}
0

dziekuje bardzo za opowiedzi... sam jeszcze przed przeczytaniem wpadlem na sposob z singletonem, ale rozjasniliscie mi dodatkowo kwestie synchronizacji.. jeszcze raz dzieki!

0

Lepiej, ale jeszcze da sie poprawic :P

public class M {
   
    private static M m = null; //private
   
    public static M getM(){ //synchronized
        if (m == null){
           synchronized(M.class){
               if(m == null){
                  m = new M();
               }
            }
         }
        return m;
    }
}

pozdrawiam

0

Może mi wytłumaczyć, dlaczego to, co napisałeś jest lepsze?
Z powodów wydajnościowych?
Podejrzewam, że chodzi o to, iż wywoływanie metod z synchronized jest obarczone narzutem, a u Ciebie zewnętrzny warunek (m == null) zajdzie prawie na pewno tylko raz i nie będzie trzeba się za każdym razem synchronizować. Zgadłem?

0

bingo! :P

pozdrawiam

0

dzieki za odpowiedzi... teraz jeszcze jedno male pytanko...
Ta klasa o ktorej rozmawialismy, czyli M jest klasa glowna projektu w ktorej kostruktorze jest przeprowadzana inicjalizaja aplikacji (ladowanie danych ,wypelnianie list, kolekcji itp itd). Mam więc pytanko... W jakis sposób zrobic aby zaraz po zdeployowaniu aplikacji na serwerz (Tomcat, Java Server 9 np) bez ingerencji uzytkownika albo byl wywolywany konstruktor tej klasy albo wlasnie metoda M.getM(). na razie niestety bardzo mam pojecie jak to przeprowadzic... Pozdrawiam

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