重构:AbstractList适配器与Java7中的每次转换?
什么时候使用一个适配器模式使用一个抽象列表比从另一个列表通过为每一个构建一个结果列表更受欢迎 鉴于以下Java bean跳过getter/setter以提高可读性:重构:AbstractList适配器与Java7中的每次转换?,java,coding-style,refactoring,Java,Coding Style,Refactoring,什么时候使用一个适配器模式使用一个抽象列表比从另一个列表通过为每一个构建一个结果列表更受欢迎 鉴于以下Java bean跳过getter/setter以提高可读性: class ObjectError { private String code; } class FieldError extends ObjectError { private String field; } class ErrorMessage { private String path; private S
class ObjectError {
private String code;
}
class FieldError extends ObjectError {
private String field;
}
class ErrorMessage {
private String path;
private String messageKey;
}
以及验证程序类的以下方法:
现在有两种选择:
保持现状
当前代码可以从上到下读取,但是验证器类的组件不太可重用
使用抽象列表适配器
convertErrors方法可以替换为列表适配器:
private static class ObjectErrorAdapter extends AbstractList<ErrorMessage> {
private List<ObjectError> objectErrors;
private ObjectErrorAdapter(List<ObjectError> objectErrors) {
this.objectErrors = objectErrors;
}
@Override public ErrorMessage get(int idx) {
return createErrorMessage(objectErrors.get(idx));
}
@Override public int size() {
return objectErrors.size();
}
ErrorMessage createErrorMessage(ObjectError error) {
ErrorMessage message = new ErrorMessage();
if (error instanceof FieldError) {
message.setMessageKey(((FieldError) error)).getPath();
}
message.setPath(error.getCode());
return message;
}
// Also hashCode() and equals() might be required for this class
}
public AllErrors validate(List<ObjectError> errors) {
AllErrors result= new AllErrors();
result.setErrors(new ObjectErrorAdapter(errors));
return result;
}
这种变体添加了大量代码和一些间接指令,但似乎增加了模块化、可重用性,从而增加了可测试性
哪种变体更可取?为什么?使用AbstractList的代码更复杂,更难理解。
由于您没有任何特定的理由重构此过早优化?我将保持原样。除非我遗漏了一些更大的细节,否则我认为使用ObjectErrorAdapter有任何好处。此外,我还遇到了一些非标准列表的问题,例如从Arrays.asList返回的列表,因此我不会实现自定义列表,即使它是一些延迟加载包装器。我认为模块化、可重用性或可测试性没有增加。如果有什么不同的话,您可以通过使用List的现有实现获得更多,因为您可以选择更轻松地更改实现。
List<ErrorMessage> convertErrors(List<ObjectError> errors) {
List<ErrorMessage> result = new ArrayList<>(errors.size());
for (ObjectError error : errors) {
result.add(createErrorMessage(error));
}
return result;
}
ErrorMessage createErrorMessage(ObjectError error) {
ErrorMessage message = new ErrorMessage();
if (error instanceof FieldError) {
message.setMessageKey(((FieldError) error)).getPath();
}
message.setPath(error.getCode());
return message;
}
private static class ObjectErrorAdapter extends AbstractList<ErrorMessage> {
private List<ObjectError> objectErrors;
private ObjectErrorAdapter(List<ObjectError> objectErrors) {
this.objectErrors = objectErrors;
}
@Override public ErrorMessage get(int idx) {
return createErrorMessage(objectErrors.get(idx));
}
@Override public int size() {
return objectErrors.size();
}
ErrorMessage createErrorMessage(ObjectError error) {
ErrorMessage message = new ErrorMessage();
if (error instanceof FieldError) {
message.setMessageKey(((FieldError) error)).getPath();
}
message.setPath(error.getCode());
return message;
}
// Also hashCode() and equals() might be required for this class
}
public AllErrors validate(List<ObjectError> errors) {
AllErrors result= new AllErrors();
result.setErrors(new ObjectErrorAdapter(errors));
return result;
}