2017-02-16 9 views
0

私は、認証トークン(String)を提供するauthクラスを持っており、そのトークンは他のすべてのクラスで使用できます。小さなコードを書いたのですが、他のすべてのクラスは認証トークンを個別に生成していました。したがって、クラスごとに1つの認証トークンがありました。しかし、私はすぐに以下のようにいくつかの変更を行いました。 Plsはこれが正しいアプローチであるか、それを行う良い方法があるかどうかを確認します。すべての拡張クラスに対して静的変数に一度だけアクセスする

public class AuthProvider { 
    public static String authKey; 
    public static String provideAuth() { 
     AuthProvider pro = new AuthProvider(); 
     String key = pro.generateAuthKey(); 
     authKey = key; 
     return key; 
    } 
    private String generateAuthKey() { 
     Random rand = new Random(); 
     int n = rand.nextInt(5000) + 1; 
     return String.valueOf(n); 
    } 
} 

上記の一つは、私の認証プロバイダクラスであり、それは

は次のように今、他の操作を実行するために認証トークンを必要とする「のFirstClass」と呼ばれる私の子クラスがある他のすべてのクラス

に認証トークンを提供

public class FirstClass extends AuthProvider { 

    public String getValueFromFirstClass() { 
     AuthProvider.provideAuth(); 
     String s = AuthProvider.authKey; 
     return "FirstClassAuth: " + s; 
    } 
} 

main方法がから一定の値を取得する責任があり、このクラスのメソッドを呼び出すためのメインクラスになるだろうSecondClassと呼ばれる私の2番目の子クラスもあります。

public class SecondClass extends AuthProvider { 

    public String getValueFromSecondClass() { 
     FirstClass firstClass = new FirstClass(); 
     String firstClassString = firstClass.getValueFromFirstClass(); 
     String s = AuthProvider.authKey; 
     return "SecondClass Auth: " + s + " -------- " + firstClassString; 
    } 
    public static void main(String[] args) { 
     SecondClass class2 = new SecondClass(); 
     System.out.println(class2.getValueFromSecondClass()); 
    } 
} 

私の要件は..私は子供のクラスごとに2つの異なる "AuthTokens"を必要としません。 FirstClassSecondClassの両方で、1つの認証トークンで作業できます。だから私がしたことは正しいのですか?それとも良い方法がありますか?

+0

あなたは[Singleton](https://en.wikipedia.org/wiki/Singleton_pattern)を探していると思います。 – yeputons

答えて

1

これはstatic初期化ブロックでグローバル定数を使用して、私のアプローチのようになります。

public class AuthProvider { 
    public static final String AUTH_KEY; 

    static { 
     AUTH_KEY = String.valueOf(new Random().nextInt(5000) + 1); 
    } 
} 

その後、他のクラスであなただけの値を取得するためにAuthProvider.AUTH_KEYを使用することができます。私は強くあなたがここにシングルトンと依存関係インジェクションを使用することをお勧めしたい

+0

これは、乱数生成のための別個のメソッド(私の実際の認証鍵生成メソッドですが、説明目的のためにマスクしたものです)を必要としないことを除いて、私が行ったのと似ています。そして、このAuthProviderクラスを認証が必要な他のすべてのクラスで拡張する必要があるかどうかは分かりますか? –

+0

私のアプローチは、 'final'宣言のためにauthキーが不変であるという追加の利点があります。 –

+0

また、AuthProviderクラスを、認証が必要な他のすべてのクラスで拡張する必要があるかどうかを知っていますか? –

1

public class AuthProvider { 
    private static final AuthProvider _instance = new AuthProvider(); 
    private final String authKey; 

    public AuthProvider() { 
     authKey = String.valueOf(new Random().nextInt(5000) + 1); 
    } 

    public static AuthProvider getInstance() { 
     return _instance; 
    } 

    public String getAuthKey() { 
     return authKey; 
    } 
} 

public class FirstClass { 
    private AuthProvider authProvider; 

    public FirstClass(AuthProvider authProvider) { 
     this.authProvider = authProvider; 
    } 

    public String getValueFromFirstClass() { 
     String s = authProvider.getAuthKey(); 
     return "FirstClassAuth: " + s; 
    } 
} 

編集1:

public class SecondClass { 
    private AuthProvider authProvider; 

    public SecondClass(AuthProvider authProvider) { 
     this.authProvider = authProvider; 
    } 

    public String getValueFromSecondClass() { 
     FirstClass firstClass = new FirstClass(authProvider); 
     String firstClassString = firstClass.getValueFromFirstClass(); 
     String s = authProvider.getAuthKey(); 
     return "SecondClass Auth: " + s + " -------- " + firstClassString; 
    } 
    public static void main(String[] args) { 
     SecondClass class2 = new SecondClass(AuthProvider.getInstance()); 
     System.out.println(class2.getValueFromSecondClass()); 
    } 
} 

SecondClass、この場合には、次のようになります

もう一度、これは最善の解決策ではありません。通常は、メインメソッドをmainメソッドのみを持つApplication.javaという別のクラスに分割します。

編集2:

そのキーワードがに関連付けられているため、我々はextendsの使用を避ける理由はあるがパラダイムです。あなたのケースでは、AuthProviderを使用しての依存関係を表現したいと思われます。FirstClassSecondClassのように聞こえる英語では、AuthProviderなしで仕事をすることはできません。

これは、AuthProviderのインスタンスを提供せずにこれらの2つのクラスを使用(インスタンス化)できないコンストラクタDI(Dependency Injection)によって実行されます。

あなたがWebアプリケーションを構築していない場合、あなたもシングルトンとしてAuthProviderを持っている必要はありません。

public class AuthProvider { 
    private final String authKey; 

    public AuthProvider() { 
     authKey = String.valueOf(new Random().nextInt(5000) + 1); 
    } 

    public String getAuthKey() { 
     return authKey; 
    } 
} 

あなたは、その後にmain方法を変更します

public static void main(String[] args) { 
    SecondClass class2 = new SecondClass(new AuthProvider()); 
    System.out.println(class2.getValueFromSecondClass()); 
} 

そして、 DIはそれをFirstClassに伝播します!

+0

しかし、私の例で説明したように、これらを 'SecondClass'でどのように使用しますか? –

+0

私はこれも "受け入れられた答え"と考えています。私はこの解決策も好きです。しかし、あなたは "これは最善の解決策ではない"と言いました。私はこれが何が欠けているのか分からない。私は、私がOPで使った例が単なるイラストレーションの目的であることを理解してもらいたい。実用的な実装は、私がこの例で示したものとほぼ同じですが。 –

+0

*これは最善の解決策ではありません。*他の責任を持つクラスに 'main'クラスを保つことを練習します。その部分をメインメソッドだけを持つ別のクラスに移動したいのはあなた次第です。 SOLIDをチェックしてください。 "S"は "責任の原則"の略で、クラスは一つのことだけをすべきであることを意味します。 'SecondClass'では、クラスが仕事をしているのと、アプリを起動するために使われているところが混在しています。 –

関連する問題