我很抱歉,如果这是一个非常基本但我在书中找不到任何东西并进行搜索。我正在尝试在创建对象时发送信息,但有很多选项,我只是真的要更改一个(不幸的是,它接近结束)。
说我有这样的事情:
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)
(这不起作用,我试过了)。
这可能吗?
答案 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);