我已经创建了我的自定义可选注释
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属性的对象?
答案 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;
}
}