0

これが非常に基本的なものである場合は申し訳ありませんが、私の本や検索では何も見つかりませんでした. オブジェクトを作成するときに情報を送信しようとしていますが、多くのオプションがあり、実際に変更するのは1つだけです(残念ながら、終わりに近づいています)。

次のようなものがあるとします。

class_to_start_(int maxActive, 
    byte whenExhaustedAction, 
    long maxWait, 
    int maxIdle, 
    int minIdle, 
    boolean testOnBorrow, 
    boolean testOnReturn, 
    long timeBetweenEvictionRunsMillis, 
    int numTestsPerEvictionRun, 
    long minEvictableIdleTimeMillis, 
    boolean testWhileIdle, 
    long softMinEvictableIdleTimeMillis, 
    boolean lifo) 

それらにはすべてデフォルト値があるため、変更する必要はありませんが、最後のデフォルト値lifoのみを変更したいと考えています。他のすべての人に値を送信せずにそれを行うことはできますか? 理想的には次のようなものですclass_to_start_('lifo'=True)(これは機能しません、私は試しました)。

これは可能ですか?

4

4 に答える 4

3

Java にはデフォルトのパラメーター値がないため、短い答えはノーです。

ただし、オーバーロードされたコンストラクターを使用して、変更したい引数を取るだけのコンストラクターを使用できます。

/** Main constructor. */
public Foo(int maxActive, 
           byte whenExhaustedAction, 
           int minIdle, 
           boolean testOnBorrow, 
           boolean lifo) 

/** Convenience constructor. */
public Foo(boolean lifo)
{
  this(1, 0x01, 3, false, lifo);    // call the main constructor will default values
}

また、流暢なインターフェイスビルダー オブジェクトを作成することも検討できます。アイデアはあなたがすることです:

final Foo f = new FooBuilder().withLifo(false).build();
于 2012-05-03T23:14:46.437 に答える
0

通常、デフォルト値が使用され、パラメーターが多い場合、コンストラクターまたはファクトリメソッドの使用は不器用になります。最も便利でエレガントなアプローチは、流暢なインターフェースを備えたセッターを使用することです。

このような:

パブリッククラスMyClass{

// Define default values in initializers
private int maxActive = 5;
private byte whenExhaustedAction = 'x';
private long maxWait = 999;
private int maxIdle = 3;
private int minIdle = 1;
private boolean testOnBorrow = true;
private boolean testOnReturn = false;
private long timeBetweenEvictionRunsMillis = 5000;
private  int numTestsPerEvictionRun = 10;
private  long minEvictableIdleTimeMillis = 2000;
private boolean testWhileIdle = false;
private long softMinEvictableIdleTimeMillis = 0;
private  boolean lifo = true; 

// Only getter/setters for first two fields shown - others similar

public int getMaxActive() {
    return maxActive;
}

// Return "this" to create a fluent interface
public MyClass setMaxActive(int maxActive) {
    this.maxActive = maxActive;
    return this;
}

public int getMaxIdle() {
    return maxIdle;
}

public MyClass setMaxIdle(int maxIdle) {
    this.maxIdle = maxIdle;
    return this;
}

// Other getters/setters to follow

}

このように使用し、デフォルト以外の値が必要なフィールドのセッターのみを呼び出します。

MyClass x = new MyClass().setMaxActive(5).setMaxIdle(100);
于 2012-05-03T23:36:52.157 に答える
0

また、目的のクラスのインスタンスを1つ作成し、すべての値を目的のデフォルト値に設定することもできます。

// in your main method
Foo myDefaults = new Foo(100, "name", false, true);
myDefaults.setLifo(false);
Foo someChangedInstance = myDefaults;

...次に、クラスのインスタンスを取得し、すべての値をパラメーター化されたインスタンスの値と等しくなるように設定するコンストラクターをクラスに追加します。

// in your Foo class
public Foo(int maxWidth, String standardName, boolean logEverything, boolean lifo) {
    // ...
}

public Foo(Foo otherInstance) {
    this.maxWidth = otherInstance.maxWidth;
    this.standardName = otherInstance.standardName;
    this.logEverything = otherInstance.logEverything;
    this.lifo = otherInstance.lifo;
}

そうすれば、クラスのインスタンスの単一の値のみを変更し、いくつかの変更のみで新しいインスタンスを作成できます。

属性を変更した後、myDefaultの属性をリセットすることを忘れないでください。

myDefault.setLifo(true);
于 2012-05-03T23:22:37.040 に答える
0

パラメーターと値のペアのマップを取得するコンストラクターを追加し、指定されていないパラメーターにはデフォルトを使用できます。そうすれば、オーバーライドするパラメーターを指定するだけで済みます。

于 2012-05-03T23:25:40.163 に答える