这是使用自定义数据注释的正确方法吗?

时间:2013-09-12 07:33:55

标签: java annotations

我定义了自定义注释(DataAttribute),如下所示。 我必须多次调用checkMaxLength(),超过10,000次。 (还有toolType,reportTitle和validLength)

我想问的是......

我认为a)是自定义注释的正确(或一般)用法。但如果我调用checkMaxLength超过10,000次(并且maxLength总是4000),那么与b)相比,它的性能不佳。

您如何看待案例b)? 这是使用自定义数据注释的正确方法吗?

a)
@DataAttribute(toolType = DataTooltype.CustomDateTime, reportTitle = "DateTime", maxLength = 4000, validLength = 4000, pollutedLength = 100)
public class DateTimeData {
    public boolean checkMaxLength(int length) {
        if (DataAnnotationUtil.maxLength(this) < length)
            return false;
        return true;
    }
}


b)
@DataAttribute(toolType = DataTooltype.CustomDateTime, reportTitle = "DateTime", maxLength = 4000, validLength = 4000, pollutedLength = 100)
public class DateTimeData {

    public int maxLength;

    public Email() {
        this.maxLength = DataAnnotationUtil.maxLength(this);
    }

    public boolean checkMaxLength(int length) {
        if (this.maxLength < length)
            return false;
        return true;
    }
}

1 个答案:

答案 0 :(得分:1)

注释对方法执行的性能没有影响。如果你的问题是DataAnnotationUtil.maxLength(this),那么在构造函数中调用它一次,而不是每次调用方法都显然更有效。但由于注释是静态类数据,因此每个类调用一次更有效。由于您的方法需要this作为参数,我不知道它是否在静态上下文中工作,但您无论如何都不需要它:

@DataAttribute(toolType = DataTooltype.CustomDateTime, reportTitle = "DateTime", maxLength = 4000, validLength = 4000, pollutedLength = 100)
public class DateTimeData {

    public static final int MAX_LENGTH = DateTimeData.class.getAnnotation(DataAttribute.class).maxLength();

    public DateTimeData() {
    }

    public boolean checkMaxLength(int length) {
        return length < MAX_LENGTH;
    }
}

但它更容易,因为根本不需要任何运行时操作。 MAX_LENGTH是一个编译时常量(所有注释值都是),因此您可以将它在类中声明为常量,并让注释引用它。然后您不需要处理注释:

@DataAttribute(toolType = DataTooltype.CustomDateTime, reportTitle = "DateTime",
// note the reference here, it’s still a single point of declaration:
maxLength = DateTimeData.MAX_LENGTH, validLength = 4000, pollutedLength = 100)
public class DateTimeData {

    public static final int MAX_LENGTH = 4000;

    public DateTimeData() {
    }

    public boolean checkMaxLength(int length) {
        return length < MAX_LENGTH;
    }
}