Kiedy stosować metody statyczne

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?

Przykład:

Obj x = new Obj();
x.someMethod();

...lub:

Obj.someMethod(); // Is this the static way?
Jestem raczej zdezorientowany!
Author: Lii, 2010-04-19

22 answers

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

Więc w klasie {[3] } możesz mieć metodę:

double convertMpgToKpl(double mpg)

...co byłoby statyczne, ponieważ ktoś mógłby chcieć wiedzieć, na co konwertuje 35mpg, nawet jeśli nikt nigdy nie zbudował Car. Jednak ta metoda (która ustala efektywność jednego konkretnego Car):

void setMileage(double mpg)

...nie może być statyczny, ponieważ jest to niewyobrażalne dla wywołanie metody przed zbudowaniem Car.

(nawiasem mówiąc, converse nie zawsze jest prawdą: czasami możesz mieć metodę, która obejmuje dwa obiekty {3]} i nadal chcesz, aby była statyczna. Np.:

Car theMoreEfficientOf(Car c1, Car c2)

Chociaż może to być przekonwertowane do wersji niestatycznej, niektórzy twierdzą, że ponieważ nie ma "uprzywilejowanego" wyboru, który Car jest ważniejszy, nie należy zmuszać wywołującego do wybrania jednego Car jako obiektu, na którym zostanie wywołana metoda. Ta sytuacja stanowi jednak dość niewielki ułamek wszystkich metod statycznych.

 1517
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
2020-11-05 10:37:03

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.
 550
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.
 191
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.

 45
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.");
     }
  }
 36
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.

 20
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.

 12
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ść.
  4. statyczna metoda może być dostępna tylko przy użyciu nazwy klasy Dot static name . . . przykład: Student9.change ();
  5. Jeśli chcesz użyć niestatyczne pola klasy, musisz użyć niestatycznej metody.

/ / 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

 12
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
2019-02-11 02:11:32

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.

 10
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

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ą.

 8
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

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

 6
Author: jamz,
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

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

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.

 4
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ć.

 4
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

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

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;
    }
};
 4
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

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óż.
 2
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

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: ave4496,
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

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ę.
 1
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

Znalazłem ładny Opis, Kiedy używać metod statycznych:

Nie ma twardych i szybkich, dobrze napisanych reguł decydujących o tym, kiedy uczynić metodę statyczną, czy nie, ale jest kilka obserwacji opartych na doświadczeniu, które nie tylko pomagają uczynić metodę statyczną, ale także uczą, kiedy używać statycznej metody w Javie. Należy rozważyć statyczną metodę w Javie:

  1. Jeśli metoda nie modyfikuje stanu obiektu lub nie używa żadnych zmiennych instancji.

  2. Ty chcesz wywołać metodę bez tworzenia instancji tej klasy.

  3. Metoda jest dobrym kandydatem na statyczność, jeśli działa tylko na podanych jej argumentach, np. public int factorial (int number) {}, ta metoda działa tylko na liczbie podanej jako argument.

  4. Metody użytkowe są również dobrym kandydatem do bycia statycznymi, np. StringUtils.isEmpty (String text), jest to metoda użytkowa do sprawdzania, czy łańcuch jest pusty, czy nie.

  5. Jeśli funkcja metody będzie metoda equals () nie jest dobrym kandydatem do statycznego tworzenia, ponieważ każda klasa może przedefiniować równość.

Źródło jest tutaj

 1
Author: Jake N,
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
2021-01-27 13:20:28

Gdy nie chcesz tworzyć obiektu do wywołania metody w kodzie, po prostu zadeklaruj tę metodę jako statyczną. Ponieważ statyczna metoda nie wymaga wywołania instancji, ale nie wszystkie statyczne metody są wywoływane przez JVM automatycznie. Ten przywilej cieszy się tylko main () " public static void main[String... args] "metoda w Javie ponieważ w czasie wykonywania jest to podpis metody public "static" void main [] poszukiwana przez JVM jako punkt wejścia do rozpoczęcia wykonywania kod.

Przykład:

public class Demo
{
   public static void main(String... args) 
   {
      Demo d = new Demo();

      System.out.println("This static method is executed by JVM");

     //Now to call the static method Displ() you can use the below methods:
           Displ(); //By method name itself    
      Demo.Displ(); //By using class name//Recommended
         d.Displ(); //By using instance //Not recommended
   }

   public static void Displ()
   {
      System.out.println("This static method needs to be called explicitly");
   }
} 

Wyjście:- Ta statyczna metoda jest wykonywana przez JVM Ta statyczna metoda musi być wywołana jawnie Ta statyczna metoda musi być wywołana jawnie Ta statyczna metoda musi być wywołana jawnie

 0
Author: Amrit,
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
2020-05-17 07:31:33