I ha fatto una domanda su StackOverflow su come implementare correttamente un ImmutableMap
che rispetti i principi SOLID.
A causa dell'interfaccia Map
di Java contenente put
e putAll
, viola il principio di segregazione dell'interfaccia forzandoci ad implementare i metodi put
e putAll
per ImmutableMap
. Se dovessimo definire la nostra interfaccia, ricaderebbe nella categoria olfattiva del codice "Classi alternative con diverse interfacce".
Questo mi ha fatto pensare a come dichiarare correttamente un'interfaccia che si attenesse al principio di Subsitution di Liskov, pur rispettando il principio di segregazione dell'interfaccia.
L'unico modo in cui posso pensare di ottenere questo sarebbe dichiarare l'interfaccia di base con solo gli accessor, quindi fornire una subinterface con i mutatori:
interface Map {
//accessor methods
}
interface MutableMap extends Map {
//mutator methods
}
class HashMap implements MutableMap {
}
class ImmutableMap implements Map {
}
Questa è considerata una "buona pratica"? Sembra essere l'unico modo per implementare l'immutabilità pur rimanendo fedele ai principi SOLID, ma non ho mai sentito parlare di una simile pratica.