2015-12-22 13 views
7

を格納擬コードとして提供パス定数クラス引数と

スニペットは、擬似コードとして解釈されるべきです。私は、この問題を解決するために標準の方法である別の解決策があるかどうかを知っています。

これは、予想される使用についてです:

いくつかの明確化:

  • ひとつ、そして唯一の設定は、アプリケーションごとに使用されます。実行時には変更されません。
  • Main.java@Overrideを許可していません。
  • Configuration.javaは、デフォルト値はオーバーライドされていないフィールドに指定する必要があるため、Interfaceにすることはできません。
  • Configuration.javaは、現在の2つのフィールドからかなり大きくなります。ビルダーパターンを非常に乱雑にレンダリングして作業してください。

Configuration.java

public class Configuration 
{ 
    public static int getFoo() { return 1; } 
    public static int getBar() { return 2; } 
} 

UserDefinedConfiguration.java

public class UserDefinedConfiguration extends Configuration 
{ 
    @Override 
    public static int getFoo() { return 3; } 
} 

Main.java

public final class Main { 
    private final Configuration config; 

    // default configuration 
    public Main() { 
     this (Configuration.class); 
    } 

    // user-defined configuration 
    public Main (Class<? extends Configuration> config) { 
     this.config = config; 
    } 

    // dummy-test 
    public void printFoo() { 
     System.out.println(config.getFoo()); 
    } 
} 

今、主な質問に、これを達成する方法は?いいえ(またはConfigurationが渡された場合)getFoo()はが3の場合は1を返します。

これを達成する1つの方法は、Configurationのインスタンスを格納することです。ただし、すべてのゲッターがstaticの場合、と重複しているように感じます。 staticのようなものを持っていないのはあまり意味がありません。

注:This is taken into account.

+2

'それは静的either.'としてそれらを持っていないためにあまり意味がありません - なぜありませんか?異なる構成セットを使用したいと思うので、各構成セットを1回だけ作成することを前提としています。したがって、非静的メソッドの「オーバーヘッド」(ある場合)と構成の1つのインスタンスの作成は重要ではありません。また、自動的にクリーンなソリューションで '@ Override'を取得します。 –

+0

複数の 'Configuration'を持つことは意味がありません。メソッドは 'Configuration'に直接属します。私は本当に "オーバーヘッド"について心配していません。 – Emz

+0

設定値はコードで保存する必要がありますか?代わりに、プロパティファイルまたはハッシュマップの階層を作成し、後で読み込まれる値が以前の値を上書きすることもあります。継承をクラス/インタフェースとしてモデル化する必要はありません。推測すると、おそらく私は質問を完全に誤解している... –

答えて

0

ので、本質的に、あなたはタイプではなく、インスタンス上の多型を必要としています。 Javaでは、これは通常、一般的なタイプで行われます。

class GenericMain<T extends Configuration> 
{ 
    private final T config; 
} 

とJavaは、デフォルトの汎用引数を許可していないので、デフォルトを指定するには、別のクラスを定義する必要があります。

class DefaultMain extends GenericMain<Configuration> 
{ 
} 

これらの試合をワンMain()Main (Class<? extends Configuration> config)のコンストラクタに1対1で対応しています。


また、あなたはConfigurationのインスタンスを格納し、このような何かを行うことができます:

public class Configuration 
{ 
    private final int foo = 1; 
    private final int bar = 2; 

    public final int getFoo() { return foo; } 
    public final int getBar() { return bar; } 

    public Configuration() {} 

    protected Configuration (int foo) { 
     this.foo = foo; 
    } 
} 

public class UserDefinedConfiguration extends Configuration 
{ 
    public UserDefinedConfiguration() { 
     super(3); 
    } 
} 
+0

私はこの 'Main'をどんな形でも公開したくありません。ユーザーが使用する唯一の方法は 'Main main = new Main();'です。また、 'Configuration'クラスは100を簡単に超えるかなりのフィールドを持ちます(はい、それらはすべて' Main'に直接関係しています)。ビルダーパターンを使用しても、フィールドを変更するのは非常に面倒です。 – Emz

1

汚い反射で遊んでない限り、私はあなたの代わりにインスタンスで作業する必要があります怖いですクラスの@JonSkeetから: - 他の方法にパラメータとして渡さ できることインスタンス (またはむしろ、そのインスタンスへの参照)、および正常として扱わ

シングルトンは単一作成されたインスタンスへのアクセスを可能にしますオブジェクト。

静的クラスは静的メソッドのみを許可します。

これは、設定をパラメータとして渡すことです。あなたのMainで、

public final class DefaultConfiguration extends Configuration { 
    public static final Configuration INSTANCE = new DefaultConfiguration(); 
    private DefaultConfiguration() {} 
    // nothing to override, use the default values 
} 

public final class UserDefinedConfiguration extends Configuration { 
    public static final Configuration INSTANCE = new UserDefinedConfiguration(); 
    private UserDefinedConfiguration() {} 
    @Override public int getFoo() { return 3; } // specific `foo` value 
} 

最後に:次に

public abstract class Configuration { 
    public int getFoo() { return 1; } 
    public int getBar() { return 2; } 
} 

、具体的な構成あたり1つのシングルトン:


は、私は、デフォルト値を定義する抽象クラスを作成します

public class Main { 
    private final Configuration config; 
    public Main() { this(DefaultConfiguration.INSTANCE); } 
    public Main(Configuration config) { this.config = config; } 
} 

Java 8では、インターフェイス内にデフォルトのメソッド実装が可能であることに注意してください。 Configurationは、インターフェイスのようになります。

public interface Configuration { 
    default int getFoo() { return 1; } 
    default int getBar() { return 2; } 
} 
+0

Java 8の 'interface'の素晴らしい発言は、私は' default'について知らなかった。この場合、私は抽象クラスを使用して同じ結果を得ることができるので、私には役立ちません。 – Emz

+0

私はそれを "私"の方法で解決するためにリフレクションに頼らなければならないのではないかと心配しました。私は好まない。 – Emz

+0

シングルトンを使用するのではなく、新しいConfiguration()を呼び出してゲッターから 'static'を削除しながら渡すことができます。しかし、これもやはり私が達成したいことではなく、ハッキーを感じる。しかし、最終的には同じ結果が得られます。私はこれを簡単に私の質問で言及した 'それを達成するための一つの方法は、設定のインスタンスを格納することです。しかし、すべてのゲッタが静的であると、重複しているように感じます。静的なものとして持っていないのはあまり意味がありません」シングルトンは私にそれを2回インスタンス化するという問題をもたらします。 – Emz