1

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

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 属性的对象?

4

3 回答 3

1

最简单的事情是定义两个构造函数。一个带 id 参数,一个不带参数。

喜欢:

public class A extends BaseClassA {

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

除非你的意思是有几个(可选的)参数并且不想写很多构造函数......

于 2013-10-13T19:33:21.850 回答
0

实际上,自定义注释并没有给您带来太多好处。如果您想为特定构造函数设置默认值,则指定一个无参数构造函数,直接传递默认参数。

public class A extends BaseClassA {
    private String id;

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

    public A() {
        this("");
    }
}
于 2013-10-13T19:38:57.233 回答
0

我建议您在特殊的构造函数注释中查看Project Lombok。无需自己动手。

@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;
    }

}
于 2013-10-13T19:46:27.767 回答