Java: kiedy używać metod statycznych

Zastanawiam się, kiedy używać metod statycznych? Powiedzmy, że jeśli mam klasę z kilkoma geterami i seterami, metodę lub dwie i chcę, aby te metody były wywoływane tylko na obiekcie instancji klasy. Czy to znaczy, że powinienem używać statycznej metody?

E. g

Obj x = new Obj();
x.someMethod

Lub

Obj.someMethod

(czy to jest sposób statyczny?)

Jestem raczej zdezorientowany!
Author: Community, 2010-04-20

20 answers

Jedna zasada: zadaj sobie pytanie " czy ma sens nazywanie tej metody, nawet jeśli nie została jeszcze skonstruowana Obj?"Jeśli tak, to zdecydowanie powinno być statyczne.

Więc w klasie Car możesz mieć metodę double convertMpgToKpl(double mpg), która byłaby statyczna, ponieważ ktoś może chcieć wiedzieć, na co konwertuje 35mpg, nawet jeśli nikt nigdy nie zbudował samochodu. Ale void setMileage(double mpg) (który ustawia sprawność jednego konkretnego samochodu) nie może być statyczna, ponieważ nie można nazwać metody przed jakimkolwiek samochodem skonstruowany.

(Btw, converse nie zawsze jest prawdą: czasami możesz mieć metodę, która obejmuje dwa Car obiekty, i nadal chcesz, aby była statyczna. Np. Car theMoreEfficientOf( Car c1, Car c2 ). Chociaż może to zostać przekonwertowane do wersji niestatycznej, niektórzy twierdzą, że ponieważ nie ma "uprzywilejowanego" wyboru, który samochód jest ważniejszy, nie powinieneś zmuszać rozmówcy do wybrania jednego samochodu jako obiektu, na którym będziesz wywoływać metodę. Sytuacja ta stanowi dość niewielki ułamek wszystkich metod statycznych, chociaż.)

 1211
Author: not-just-yeti,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-04-19 23:56:15

Definiowanie metod statycznych tylko w następujących scenariuszach:

  1. Jeśli piszesz klasy użyteczności i nie powinny być zmieniane.
  2. Jeśli metoda nie używa żadnej zmiennej instancji.
  3. Jeśli jakakolwiek operacja nie jest zależna od utworzenia instancji.
  4. Jeśli istnieje jakiś kod, który może być łatwo współdzielony przez wszystkie metody instancji, wyodrębnij ten kod do statycznej metody.
  5. Jeśli masz pewność, że definicja metody nigdy nie ulegnie zmianie lub overridden. Ponieważ metody statyczne nie mogą być nadpisywane.
 470
Author: Mohd,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-03-01 19:36:32

Istnieje kilka ważnych powodów, aby używać metod statycznych:

  • Performance: jeśli chcesz, aby jakiś kod został uruchomiony i nie chcesz tworzyć instancji dodatkowego obiektu, wepchnij go do statycznej metody. JVM może również dużo optymalizować statyczne metody (myślę, że kiedyś czytałem Jamesa Goslinga oświadczając, że nie potrzebujesz niestandardowych instrukcji w JVM, ponieważ metody statyczne będą tak samo szybkie, ale nie mogą znaleźć źródła-więc może być całkowicie fałszywe). Tak, jest. mikro-optymalizacja i prawdopodobnie niepotrzebna. A my programiści nigdy nie robimy niepotrzebnych rzeczy tylko dlatego, że są fajni, prawda?

  • Praktyczność : zamiast wywoływać new Util().method(arg), wywoływać Util.method(arg) lub {[2] } z importem statycznym. Łatwiej, krócej.

  • Dodawanie metod : naprawdę chciałeś, aby łańcuch klas miał metodę instancji removeSpecialChars(), ale jej tam nie ma (i nie powinna, ponieważ znaki specjalne twojego projektu mogą się różnić od innych projektów), i nie możesz go dodać (ponieważ Java jest nieco rozsądna), więc tworzysz klasę narzędzia i wywołujesz removeSpecialChars(s) zamiast s.removeSpecialChars(). Słodko.

  • Czystość: biorąc pod uwagę pewne środki ostrożności, twoja statyczna metoda będzie czystą funkcją , czyli jedyną rzeczą, od której zależy, są jej parametry. Data wchodzi, data wychodzi. Jest to łatwiejsze do odczytania i debugowania, ponieważ nie masz dziwactwa dziedziczenia martwić. Możesz to zrobić również za pomocą metod instancyjnych, ale kompilator pomoże Ci trochę bardziej z metody statyczne (poprzez Nie zezwalanie na odwoływanie się do atrybutów instancji, nadpisywanie metod, itd.).

Będziesz musiał również utworzyć statyczną metodę, jeśli chcesz utworzyć singleton, ale... pomyśl dwa razy.

Co ważniejsze, dlaczego nie chcesz stworzyć statycznej metody? Zasadniczo, polimorfizm wychodzi z okna . Nie będziesz w stanie nadpisać metody, ani zadeklarować jej w interfejsie (pre-Java 8) . Informatyka projekt wymaga dużej elastyczności. Ponadto, jeśli potrzebujesz state, skończysz z mnóstwem błędów współbieżności i / lub wąskich gardeł, jeśli nie będziesz ostrożny.
 143
Author: tetsuo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-09 13:19:12

Po przeczytaniu artykułów Misko uważam, że statyczne metody są złe z testowego punktu widzenia. Zamiast tego powinieneś mieć factories (Być może używając narzędzia do wstrzykiwania zależności, takiego jak Guice).

Jak mam się upewnić, że mam tylko jedno z czegoś

Tylko jeden z czegoś Problem "jak zapewnić, że I tylko jeden z czegoś " jest ładnie / align = "left" / Tworzysz tylko a pojedyncza aplikacja w Twoim główna, oraz w rezultacie, ty tylko tworzenie instancji pojedynczej instancji wszystkich Twoich singletonów.

Podstawowym problemem metod statycznych jest to, że są one kodami proceduralnymi

Podstawowy problem z metodami statycznymi to są kodeksem proceduralnym. Nie mam pomysł jak przetestować kod proceduralny. Testowanie jednostkowe zakłada, że mogę Utwórz fragment mojej aplikacji w izolacji. W trakcie tworzenia Podłączam zależności z kpiny / friendlies, które zastępują real zależności. Z proceduralnym programowanie nie ma nic do " drutu" ponieważ nie ma obiektów, kod a dane są oddzielne.

 38
Author: Alfred,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-04-20 01:14:45

A static metoda jest typem metody, która nie wymaga inicjalizacji żadnego obiektu do jej wywołania. Czy zauważyłeś, że static jest używany w funkcji main w Javie? Uruchamianie programu rozpoczyna się od tego miejsca bez tworzenia obiektu.

Rozważ następujący przykład:

 class Languages 
 {
     public static void main(String[] args) 
     {
         display();
     }

     static void display() 
     {
         System.out.println("Java is my favorite programming language.");
     }
  }
 29
Author: Zishan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-28 21:20:29

Statyczne metody w Javie należą do klasy (nie do jej instancji). Nie używają zmiennych instancji i zazwyczaj pobierają dane wejściowe z parametrów, wykonują na nich akcje, a następnie zwracają jakiś wynik. Metody instancji są powiązane z obiektami i, jak sama nazwa wskazuje, mogą używać zmiennych instancji.

 15
Author: Kevin Sylvestre,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-04-19 23:08:26

Nie, statyczne metody nie są powiązane z instancją; należą do klasy. Metody statyczne są twoim drugim przykładem; metody instancji są pierwszym.

 10
Author: duffymo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-04-19 23:08:32

Jeśli zastosujesz słowo kluczowe statyczne z dowolną metodą, jest ono znane jako metoda statyczna.

  1. statyczna metoda należy do klasy, a nie do obiektu klasy.
  2. statyczna metoda wywoływana bez potrzeby tworzenia instancji klasy.
  3. metoda statyczna może uzyskać dostęp do statycznego elementu danych i zmienić jego wartość.

/ / Program do zmiany wspólnej własności wszystkich obiektów (pole statyczne).

class Student9{  
 int rollno;  
 String name;  
 static String college = "ITS";  

 static void change(){  
 college = "BBDIT";  
 }  

 Student9(int r, String n){  
 rollno = r;  
 name = n;  
 }  

 void display (){System.out.println(rollno+" "+name+" "+college);}  

public static void main(String args[]){  
Student9.change();  

Student9 s1 = new Student9 (111,"Indian");  
Student9 s2 = new Student9 (222,"American");  
Student9 s3 = new Student9 (333,"China");  

s1.display();  
s2.display();  
s3.display();  
}  }

O/ P: 111 Indian BBDIT 222 Amerykański BBDIT 333 Chiny BBDIT

 9
Author: IndianProgrammer1234,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-13 16:10:09

Statyczne metody nie są powiązane z instancją, więc nie mogą uzyskać dostępu do żadnych niestatycznych pól w klasie.

Można użyć metody statycznej, jeśli metoda nie używa żadnych pól (lub tylko pól statycznych) klasy.

Jeśli używane są dowolne niestatyczne pola klasy, musisz użyć metody niestatycznej.

 6
Author: Carsten,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-04-19 23:12:03

Właściwie, używamy statycznych właściwości i metod w klasie, kiedy chcemy użyć jakiejś części naszego programu, która powinna tam istnieć, dopóki nasz program nie będzie uruchomiony. I wiemy, że do manipulowania statycznymi właściwościami potrzebujemy statycznych metod, ponieważ nie są one częścią zmiennej instancji. A bez metod statycznych manipulowanie właściwościami statycznymi jest czasochłonne.

 6
Author: Sagar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-03-11 04:56:52

Użyj metody statycznej, jeśli chcesz mieć dostęp do metody bez instancji klasy.

 4
Author: Jamey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-04-19 23:08:46

Statyczne metody i zmienne są kontrolowaną wersją 'globalnych' funkcji i zmiennych w Javie. W którym metody mogą być dostępne jako classname.methodName() LUB classInstanceName.methodName(), tzn. statyczne metody i zmienne mogą być dostępne za pomocą nazwy klasy, a także instancji klasy.

Klasa nie może być zadeklarowana jako statyczna (ponieważ nie ma to sensu. jeśli klasa jest zadeklarowana jako Publiczna, może być dostępna z dowolnego miejsca), klasy wewnętrzne mogą być zadeklarowane jako statyczne.

 4
Author: Manju Yadav,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-11-10 16:22:49

Static: Obj.someMethod

Użyj static, gdy chcesz zapewnić dostęp do metody na poziomie klasy, tzn. gdy metoda powinna być wywołana bez instancji klasy.

 3
Author: Finbarr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-04-19 23:10:52

Statyczne metody nie muszą być wywoływane na obiekcie i wtedy go używasz. Przykład: Twoja Main() jest statyczna i nie tworzysz obiektu, aby go wywołać.

 3
Author: Vaishak Suresh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-04-20 05:21:20

Metody statyczne mogą być użyte, Jeśli

  • Nie chce się wykonywać akcji na instancji (metody użytkowe)

    Jak wspomniano w kilku powyższych odpowiedzi w tym poście, przeliczanie mil na kilometry, lub obliczanie temperatury od Fahrenheita do Celsjusza i vice-versa. Z tymi przykładami stosującymi metodę statyczną, nie ma potrzeby tworzenia instancji całego nowego obiektu w pamięci sterty. Rozważ poniżej

    1. new ABCClass(double farenheit).convertFarenheitToCelcium() 
    2. ABCClass.convertFarenheitToCelcium(double farenheit)
    

    Pierwsza tworzy nową klasę footprint dla każdej metody wywołania, osiągi, praktyczne. Przykłady to Math i Apache-Commons library StringUtils class poniżej:

    Math.random()
    Math.sqrt(double)
    Math.min(int, int)
    StringUtils.isEmpty(String)
    StringUtils.isBlank(String)
    
  • Chce się używać jako prostej funkcji. Dane wejściowe są wyraźnie przekazywane i otrzymywane jako wartość zwracana. Inheritence, object instanciation nie pojawia się w obrazie. Zwięzły, Czytelny.

Uwaga : Niewielu ludzi argumentuje przeciwko testowalności metod statycznych, ale metody statyczne można również przetestować! Z jMockit, można naśladować metody statyczne. Testowalność. Przykład poniżej:

new MockUp<ClassName>() {
    @Mock
    public int doSomething(Input input1, Input input2){
        return returnValue;
    }
};
 3
Author: Amit Kaneria,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-23 15:37:37

Metody statyczne to metody w Javie, które można wywołać bez tworzenia obiektu klasy. Należy do klasy.

Używamy metody statycznej, gdy nie ma potrzeby wywoływania metody za pomocą instancji.

 3
Author: rashedcs,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-28 08:57:18

Zastanawiam się, kiedy stosować metody statyczne?

  1. powszechnym zastosowaniem metod static jest dostęp do pól static.
  2. Ale możesz mieć metody static, bez odwoływania się do zmiennych static. Metody pomocnicze bez odwoływania się do zmiennej static można znaleźć w niektórych klasach Javy, takich jak java.lang.Matematyka

    public static int min(int a, int b) {
        return (a <= b) ? a : b;
    }
    
  3. Innym przypadkiem użycia, mogę myśleć o tych metodach w połączeniu z metodą synchronized jest implementacja blokowania poziomu klasy w środowisko wielowątkowe.

Powiedzmy, że jeśli mam klasę z kilkoma geterami i seterami, metodę lub dwie i chcę, aby te metody były wywoływane tylko na obiekcie instancji klasy. Czy to znaczy, że powinienem używać statycznej metody?

Jeśli chcesz uzyskać dostęp do metody na obiekcie instancji klasy, twoja metoda powinna być niestatyczna.

Strona

Dokumentacja Oracle zawiera więcej szczegółów.

Nie wszystkie kombinacje instancji dozwolone są zmienne i metody klasy:

  1. metody instancji mogą uzyskać bezpośredni dostęp do zmiennych instancji i metod instancji.
  2. metody instancji mogą uzyskać bezpośredni dostęp do zmiennych klasy i metod klasy.
  3. metody klas mogą uzyskać bezpośredni dostęp do zmiennych klasy i metod klasy.
  4. metody klas nie mogą uzyskać dostępu do zmiennych instancji lub metod instancji bezpośrednio-muszą używać odniesienia do obiektu. Również metody klas nie mogą używać tego słowa kluczowego, ponieważ nie ma przykład do tego odnosi się.
 2
Author: Ravindra babu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-24 17:12:29

W eclipse możesz włączyć ostrzeżenie, które pomaga wykryć potencjalne statyczne metody. (Nad podświetloną linią jest kolejna, której zapomniałem podświetlić)

ustawienie eclipse

 1
Author: user489872,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-06 10:32:23

Metoda statyczna ma dwa główne cele:

  1. dla metod użytkowych lub pomocniczych, które nie wymagają żadnego stanu obiektu. Ponieważ nie ma potrzeby dostępu do zmiennych instancji, mając statyczne metody eliminują konieczność tworzenia instancji obiektu przez wywołującego tylko po to, żeby wywołać metodę.
  2. dla państwa, które jest wspólne dla wszystkich instancje klasy, jak licznik. Wszystkie instancje muszą dzielić ten sam stan. Metody, które tylko używają tego stanu, powinny być statyczne jako cóż.
 1
Author: hemanto,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-05 07:42:23

Statyczne metody powinny być wywoływane na klasie, instancje powinny być wywoływane na instancjach klasy. Ale co to oznacza w rzeczywistości? Oto przydatny przykład:

Klasa samochodów może mieć metodę instancji o nazwie Accelerate(). Można przyspieszyć samochód tylko wtedy, gdy samochód rzeczywiście istnieje (został zbudowany) i dlatego jest to metoda przykładowa.

Klasa samochodów może mieć również metodę count o nazwie GetCarCount (). To zwróci całkowitą liczbę samochodów stworzonych (lub zbudowanych). Gdyby nie powstały żadne samochody, metoda ta zwracałaby 0, ale nadal powinna być możliwa do wywołania, a zatem musiałaby być metodą statyczną.

 1
Author: Charlie Seligman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-25 14:28:00