在AbstractHttpMessageConverter中readInternal和read之间有什么区别?

时间:2018-05-04 10:45:55

标签: java spring

如标题,我不明白为什么在这堂课中需要两种方法。

Source code

/**
 * 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;

1 个答案:

答案 0 :(得分:3)

请注意,readfinal。没有人可以覆盖它。

readInternalabstract,因此扩展该类的每个人必须覆盖它(除非他们的类也是抽象的)。

这是表面上不必要的;但是它为AbstractHttpMessageConverter的维护者提供了改变所有子类行为的机会 - 例如,在readInternal之前或之后调用某个方法 - 而不会在调用之前/之后将调用的负担传递给人们类。

它基本上是面向未来的课程设计。或者,正如@Ben指出的那样,它可能是旧代码的残余,其中曾经是方法中的其他东西。