如标题,我不明白为什么在这堂课中需要两种方法。
/**
* This implementation simple delegates to {@link #readInternal(Class, HttpInputMessage)}.
* Future implementations might add some default behavior, however.
*/
@Override
public final T read(Class<? extends T> clazz, HttpInputMessage inputMessage) throws IOException {
return readInternal(clazz, inputMessage);
}
// ...
/**
* Abstract template method that reads the actual object. Invoked from {@link #read}.
* @param clazz the type of object to return
* @param inputMessage the HTTP input message to read from
* @return the converted object
* @throws IOException in case of I/O errors
* @throws HttpMessageNotReadableException in case of conversion errors
*/
protected abstract T readInternal(Class<? extends T> clazz, HttpInputMessage inputMessage)
throws IOException, HttpMessageNotReadableException;
答案 0 :(得分:3)
请注意,read
为final
。没有人可以覆盖它。
readInternal
是abstract
,因此扩展该类的每个人必须覆盖它(除非他们的类也是抽象的)。
这是表面上不必要的;但是它为AbstractHttpMessageConverter
的维护者提供了改变所有子类行为的机会 - 例如,在readInternal
之前或之后调用某个方法 - 而不会在调用之前/之后将调用的负担传递给人们类。
它基本上是面向未来的课程设计。或者,正如@Ben指出的那样,它可能是旧代码的残余,其中曾经是方法中的其他东西。