I think one of two things need to happen to the SegmentReader class. Either make the 'segment' variable protected, or make the the initialize() method protected.
Without this, subclassing SegmentReader is impossible, since there is no way for the derived class to know what segment it is working with. In implementing the 'reopen()' method SegmentReader needs to be subclassed in order to support 'refreshing' the deleted documents.