有没有办法将值传递给构造函数中的特定项?

时间:2012-05-03 23:09:27

标签: java

我很抱歉,如果这是一个非常基本但我在书中找不到任何东西并进行搜索。我正在尝试在创建对象时发送信息,但有很多选项,我只是真的要更改一个(不幸的是,它接近结束)。

说我有这样的事情:

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 个答案:

答案 0 :(得分: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
}

您还可以查看制作fluent interface构建器对象。那么你的想法是:

final Foo f = new FooBuilder().withLifo(false).build();

答案 1 :(得分: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);

答案 2 :(得分:0)

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

答案 3 :(得分:0)

当通常使用默认值,并且有很多参数时,使用构造函数或工厂方法会变得笨拙。最方便和优雅的方法是使用具有fluent interface

像这样:

公共类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

}

像这样使用它,只调用你想要的值不是默认值的字段的setter:

MyClass x = new MyClass().setMaxActive(5).setMaxIdle(100);