2013-08-22 6 views
5

私はメソッドを呼び出すいくつかのメソッドを使用してきました。最近、私はクラスの静的インスタンスを使用しています。私はそれが適切な用語だと信じています(私が間違っていれば私を修正してください)。どちらが良いですか(またはアイデアを提案する)、そしてなぜですか?クラスのインスタンスを1つだけ持つ方がよいか、あるいは単に静的メソッドがたくさんあるのですか?

最初の方法は単純な古い静的メソッドです。

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

第2の方法(誰かがこれが改良されていると言います)。

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インスタンスが正しい表現ではありません。これは、あるインスタンスを参照するクラスの静的フィールドを記述します。あなたは、クラス型で静的に呼び出されるメソッドについて話しています。 –

+0

ありがとうございました、私はその言葉が何であるかを正確には特定できませんでした。 – Jaccob

+0

"public static instance;"それは直接的または間接的に何を意味しますか?いいえデータ型:O –

答えて

6

あなたが探している用語はシングルトンです。

シングルトンのメソッドとインスタンスメソッドはどちらも問題ありませんが、静的メソッドのアプローチではインターフェイスを実装できないため、インターフェイスを実装する必要がある場合はシングルトンを使用してください。例えば

public enum HelloWorld implements Runnable { 
    INSTANCE; 

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

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

あなたのhello世界のコードを静的メソッドにあった場合、それは直接Runnableインターフェイスを実装することはできなかったでしょう。

+0

私は、ありがとう、参照してください。 – Jaccob

+1

コンパイラを実装するのにそれらを使用していますが、決してenumを使用することは考えられませんでした。 Cool :) – StormeHawke

+0

@StormeHawkeこれは「enum singleton pattern」と呼ばれ、[Effective Java 2nd ed](http://www.informit.com/store/effective-java-9780321356680)のItem 3に記述されています。その本は読める価値があり、私はすべてのJavaプログラマーがそれを読むべきだと思います。 :-D –

4

すべてのメソッドが静的で、クラスの初期化やクラスメンバーの必要がない場合は、静的ユーティリティクラスを作成するだけです。

静的関数のみを持つ静的クラスは問題ありません。

chrisが私の上で答えたように、シングルトンを探しているように思えます。シングルトンは、クラスに静的ではないが、インスタンスの数を制限したい場合にのみ使用する必要があります。

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

母、私はそのような静的ユーティリティクラスを持つことは "悪い"プログラミングであることを教えてきました。 – Jaccob

+0

理由を説明してください。 – TomF

1

クラスには静的メソッドのみを持たせることができ、必要に応じてメソッドはそのクラスの静的フィールドを永続データとして使用できます。あるいは、 "シングルトン"クラスのインスタンスを使用して、インスタンスメソッドとインスタンスフィールドでほぼ同じことを行うことができます。

一般に、状態を持たないメソッド(Mathクラスなど)のみからなるクラスがある場合は、メソッドを静的にし、インスタンスを持たない/許可しないでください。しかし、メソッドがいくつかの共有状態を持たなければならない場合は、何らかの「シングルトン」実装を持つことが賢明でしょう。

+0

シングルトンを持つことは決して「賢明」ではありません。 – TomF

+0

とにかく状態がなくても非静的なクラスにするのは良い考えかもしれないと思っています*将来、ある時点で実装が状態を必要とするものに変更されることが考えられる場合は考えられます。それが起こった場合、クラスを使用するすべてのコードを変更する必要はありません。 Mathクラスは、状態が必要になるとは考えられない*例となります。しかし、それは本当にクラスが何を表し、その中のメソッドが何であるかに依存します。もちろん、 'ExampleClass'のようなクラスではわかりません。 – ajb

+0

@TomF - シングルトンにはいくつかの利点があります。たとえば、シングルトンを簡単に(そして構成的に)サブクラス化することができます。しかし、これは静的メソッドとは関係ありません。 –

1

適切なシングルトンを作成するには、コンストラクタをプライベートにする必要があります。静的な最終宣言は、クラスが最初にロードされるときにインスタンスが初期化されることを保証します。これは、Javaでシングルトンを作成する最も簡単な方法ですが、別の方法があることに注意してください。

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

クラスのインスタンスを取得するには:class_がの

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

最も簡単な方法は、Chrisが答えてくれたように、 'enum'を使うことです。マルチスレッドアプリで心配する必要はありません。 – GriffeyDog

関連する問題