如何为可能并不总是存在的函数/构造函数提供参数?

时间:2013-10-13 19:27:45

标签: java

我已经创建了我的自定义可选注释

import static java.lang.annotation.ElementType.FIELD;
import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.ElementType.PARAMETER;
import static java.lang.annotation.ElementType.CONSTRUCTOR;

import static java.lang.annotation.RetentionPolicy.RUNTIME;


import java.lang.annotation.Retention;
import java.lang.annotation.Target;

@Retention(RUNTIME)
@Target({FIELD,PARAMETER,METHOD,CONSTRUCTOR})
public @interface Optional {
    String id() default "";
}

在我的课堂上,我使用过它:

public class A extends BaseClassA {

    @Optional
    private String id;
    public A(@Optional final String id) {
        this.id=id;
    }
}

基本上我并不总是有这个参数的值。在本例中我还省略了其他字段以保持简单。

在我的测试中,我希望像这样实例化

A anObject = new A("1000") //example of when Id exists
A anObject = new A() // example of when Id doesn't exist. 

如何使用此可选注释创建具有/不提供id属性的对象?

3 个答案:

答案 0 :(得分:1)

最简单的方法是定义两个构造函数。一个采用id参数,一个采用无参数。

像:

public class A extends BaseClassA {

    @Optional
    private String id;
    public A(@Optional final String id) {
        this.id=id;
    }
    public A() {
        // do nothing...
    }
}

除非您的意思是拥有多个(可选)参数,并且不希望编写许多构造函数...

答案 1 :(得分:0)

实际上,自定义注释并不会给你带来太大的影响。如果要为特定构造函数设置默认值,请指定一个直接传递默认参数的无参数构造函数。

public class A extends BaseClassA {
    private String id;

    public A(final String id) {
        this.id = id;
    }

    public A() {
        this("");
    }
}

答案 2 :(得分:0)

我建议你在Project Lombok特别Constructor annotations查看{{3}}。无需自己动手。

@RequiredArgsConstructor
@AllArgsConstructor   
public class A extends BaseClassA {

    private String id;

}

将生成空构造函数(因为id不是final或已使用@NonNull注释)和构造函数id(以满足@AllArgsConstructor })

生成:

public class A extends BaseClassA {

    private String id;

    public A() {
    }

    @java.beans.ConstructorProperties({"id"})
    public A(String id) {
       this.id = id;
    }

}