These fields default to dummy stores, which sub-classes expected to override them with the constructor provided fields if it makes sense. While this approach avoids a lot "if (<use cache>) { ... } else { ... } " statements, the use of names like "srvCache" and memCache do not make the intent clear at all. There should be fields named after what the cache is for, e.g. "statCache" or "credentialCache". They can be set based on the "srvCache"/"wanCache" constructor parameters.
If there are to be any fields named "srvCache"/"wanCache", then they should always use any injected cache.
The "cheapCache" field also has some relation to the number of operations in a file batch, given how doOperationsInternal() can resize it temporarily. It should be named in a way that makes the intent clear. It is a file path cache; if containers or other things were also loaded into it, then it could be filled up in doOperationsInternal, causing some extra memcached queries.
In SwiftFileBackend, "srvCache" is also redundantly re-declared.