Jedna praktyczna zasada: zadaj sobie pytanie „Czy sensowne jest wywoływanie tej metody, nawet jeśli żaden obiekt nie został jeszcze zbudowany?” Jeśli tak, zdecydowanie powinien być statyczny.
Więc w klasie Car
możesz mieć metodę:
double convertMpgToKpl(double mpg)
... który byłby statyczny, ponieważ można by chcieć wiedzieć, na co konwertuje 35mpg, nawet jeśli nikt nigdy go nie zbudował Car
. Ale ta metoda (która określa wydajność jednego konkretnego Car
):
void setMileage(double mpg)
... nie może być statyczny, ponieważ nie jest możliwe wywołanie metody, zanim Car
zostanie ona zbudowana.
(Nawiasem mówiąc, odwrotność 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żna to przekonwertować na wersję niestatyczną, niektórzy twierdzą, że skoro nie ma „uprzywilejowanego” wyboru, który Car
jest ważniejszy, nie powinieneś zmuszać dzwoniącego do wybrania jednego Car
jako obiektu, który wywołasz metoda włączona. Ta sytuacja stanowi jednak niewielki ułamek wszystkich metod statycznych.)