0

如果这是一个非常基本的内容,我很抱歉,但我在我的书和搜索中找不到任何东西。我试图在创建对象时发送信息,但有很多选择,我只是真的要改变一个(不幸的是,它接近尾声)。

说我有这样的事情:

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

还可以创建所需类的一个实例并将所有值设置为所需的默认值:

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

您可以添加一个构造函数,该构造函数采用参数和值对的 Map,并对未指定的任何参数使用默认值。这样,您只需要指定要覆盖的参数。

于 2012-05-03T23:25:40.163 回答
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 回答