2013-09-12 2 views
0

Я определил пользовательскую аннотацию (DataAttribute), как показано ниже. И я должен позвонить checkMaxLength() много раз, более 10000 раз. (Также toolType, ReportTitle и validLength также)Правильно ли это использовать аннотацию пользовательских данных?

То, что я хотел бы спросить ..

я думаю) правильно (или вообще) использование пользовательских аннотаций. но если я вызываю checkMaxLength более 10000 раз (и maxLength всегда 4000), это не хорошо для производительности по сравнению с 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

Аннотации не влияют на эффективность выполнения метода. Если ваш вопрос о 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; 
    } 
} 
+0

+1, спасибо. «Аннотации не влияют на производительность выполнения метода. Если ваш вопрос касается DataAnnotationUtil.maxLength (это), более эффективно вызывать его один раз в конструкторе вместо каждого вызова метода». этот ответ - это то, что я хочу. 100% очищено. :) и спасибо за ваше предложение. @Holger –

Смежные вопросы