2013-08-22 31 views
5

Używam kilku metod wywoływania metod. Niedawno używałem statycznej instancji klasy, uważam, że to właściwy termin (popraw mnie, jeśli się mylę). Co jest lepsze (a nawet sugeruje pomysły) i dlaczego?Czy lepiej jest mieć jedną instancję klasy lub po prostu mieć kilka statycznych metod?

Pierwszy sposób, w jaki byłem prostymi, starymi metodami statycznymi.

static void exampleMethod1(){} 
static void exampleMethod2(){} 

Drugi sposób (ktoś powiedział, że to ulepszenie).

public class ExampleClass{ 

    public static ExampleClass instance; 

    public ExampleClass(){ 
    instance = this; 
    } 

    public static ExampleClass getInstance(){ 
     return instance; 
    } 

    void exampleMethod1(){ 
     //code 
    } 

    void exampleMethod2(){ 
     //code 
    } 

    // To call the method I simply getInstance().exampleMethod1  

} 
+3

_static instancja class_ nie jest poprawny wyraz. To by opisywało pole statyczne klasy odwołującej się do pewnej instancji. Mówisz o metodach zwanych statycznie na typie klasy. –

+0

Dziękuję, nie byłem dokładnie pewien, co to określenie. – Jaccob

+0

"public static instance;" co to bezpośrednio lub pośrednio oznacza. Brak typu danych: O –

Odpowiedz

6

Termin szukasz jest Singleton.

Obie metody statyczne i metody instancji na singletonie są w porządku, ale należy pamiętać, że podejście metod statycznych nie może zaimplementować interfejsu, więc jeśli potrzebujesz implementować interfejs, użyj singletonu.

Na przykład:

public enum HelloWorld implements Runnable { 
    INSTANCE; 

    @Override 
    public void run() { 
     System.out.println("Hello, world!"); 
    } 
} 

// ... 
new Thread(HelloWorld.INSTANCE).start(); 

Jeśli kod hello-world były w sposób statyczny, nie byłby w stanie bezpośrednio implementować interfejs Runnable.

+0

Widzę, dziękuję. – Jaccob

+1

Nigdy nie myślałem o używaniu do tego wyliczenia, choć używam ich do implementacji Komparatora . Cool :) – StormeHawke

+0

@StormeHawke Nazywa się to "wzorem enum singleton" i jest opisane w punkcie 3 [Effective Java 2nd ed] (http://www.informit.com/store/effective-java-9780321356680). Ta książka jest warta przeczytania i myślę, że każdy programista Javy powinien ją przeczytać. :-D –

4

Jeśli wszystkie metody są statyczne i nie ma potrzeby inicjowania klasy lub posiadania członków klasy, wystarczy utworzyć statyczną klasę narzędzi.

Klasa statyczna z tylko statycznymi funkcjami jest w porządku.

Tak jak chris odpowiedział mi wyżej, brzmi to tak, jakbyś szukał singletonu, którego powinieneś używać tylko wtedy, gdy masz klasy nie statyczne, ale chcesz ograniczyć liczbę jego wystąpień.

public static class GeneralFunctions 
{ 
    public static class ArrayFunctions 
    { 
     public static void OnArray{}; 
    } 

    public static class PrintingFunctions 
    { 
     public static void PrintBuffer(byte[] buffer){}; 
     public static void PrintQword(ulong qword){}; 
    } 
} 
+0

Haha, uczono mnie, że posiadanie takich statycznych klas użytkowych jest "złym" programowaniem. – Jaccob

+0

Proszę wyjaśnić, dlaczego. – TomF

1

Możesz mieć klasę tylko statycznymi metodami, a metody mogą (jeśli to konieczne) używać statycznych pól w klasie dla ich trwałych danych. Lub możesz użyć instancji klasy "singleton", aby zrobić z grubsza to samo z metodami instancji i polami instancji.

Ogólnie, jeśli masz klasę, która składa się tylko z metod, które nie mają stanu (np. Klasa Math), powinieneś uczynić metody statycznymi i nie mieć/zezwalać na instancję. Jeśli jednak metody muszą mieć pewien stan współdzielony, prawdopodobnie jest mądrzejszy, aby mieć jakąś implementację "singleton".

+0

Nigdy nie jest "mądrzejszy" mieć singleton, w ostateczności, jeśli musisz. – TomF

+0

Myślę, że dobrym pomysłem byłoby mimo wszystko uczynienie go niestatyczną klasą, nawet jeśli nie ma stanu, * jeśli * można sobie wyobrazić, że kiedyś w przyszłości implementacja może zmienić się na taką, która wymaga stanu. Następnie, jeśli tak się stanie, nie będziesz musiał zmieniać całego kodu, który używa klasy. Klasa Math będzie przykładem, w którym * nie jest * wyobrażalne, że stan byłby kiedykolwiek potrzebny. Ale to naprawdę zależy od tego, co reprezentuje klasa i od tego, jakie są metody w niej zawarte, i oczywiście nie możemy tego stwierdzić za pomocą klasy takiej jak "ExampleClass". – ajb

+0

@TomF - Istnieje kilka korzyści dla singleton. Na przykład możesz łatwo (i konfigurowalnie) podklasować singleton, co jest w najlepszym przypadku niezręczne z klasą w pełni statyczną. (Ale zgadzam się, że singletony są zwykle używane jako pierwsza opcja, gdy istnieje wiele lepszych opcji, ale to nie ma nic wspólnego z metodami statycznymi.) –

1

Aby utworzyć poprawny singleton, należy ustawić konstruktor jako prywatny. Statyczna deklaracja końcowa gwarantuje, że instancja zostanie zainicjowana po załadowaniu pierwszej klasy. Jest to najprostszy sposób tworzenia singletonów w Javie, ale zauważ, że są inne sposoby.

public class ExampleClass 
{ 
    private final static ExampleClass instance = new ExampleClass(); 

    private ExampleClass() 
    { 
     // prevents instantiation 
    } 

    public static ExampleClass getInstance() 
    { 
     return instance; 
    } 

    void exampleMethod1() 
    { 
     //code 
    } 

    void exampleMethod2() 
    { 
     //code 
    }  
} 

Aby uzyskać instancję klasy:

ExampleClass exampleClass = ExampleClass.getInstance(); 
exampleClass.exampleMethod1(); 
+0

Najprostszym sposobem jest użycie 'wyliczenia ', tak jak zrobił to Chris w swojej odpowiedzi. Bez zmartwień z aplikacjami wielowątkowymi. – GriffeyDog