所以,这或多或少是一个编码风格的问题。我在这里使用 Bean Validation,但对于任何具有简单实现且不太可能经常更改的接口,这个想法都是相同的。
@Target( { METHOD, FIELD, ANNOTATION_TYPE })
@Retention(RUNTIME)
@Constraint(validatedBy = PhoneNumber.PhoneNumberValidator.class)
@Documented
public @interface PhoneNumber {
String message() default "Must Be A Valid Phone Number";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
public class PhoneNumberValidator implements ConstraintValidator<PhoneNumber, String>{
public void initialize(PhoneNumber arg0) {}
public boolean isValid(String phoneNumberStr, ConstraintValidatorContext unused) {
return phoneNumberStr.replaceAll("[^\\d|x]", "").matches("\\d{10,12}(x\\d+$)?");
}
}
}
因此,PhoneNumberValidator 是这个特定验证器(或生产者方法或拦截器等)的实现,我们不太可能经常更改实现。
这是通过将实现和接口放在附近来为我的代码提供凝聚力的好方法,还是这是一种紧密耦合不应耦合的两段代码的代码气味?
你参与过类似的项目吗?如果是这样,它使事情变得更好还是更糟?如果没有,你会觉得这种做法令人困惑吗?
Community Wiki'd 因为它在征求意见。