Вот тут нарушение контракта.
Вы должны при старте приложения считать  и запомнить все созданные таблицы, а ```getTable()```'ом - вернуть запомненную версию. Таким образом, получается, что два подряд вызванных ```getTable(n)``` должны вернуть один и тот же объект. Кроме того, если таблица была создана сейчас, ```createTable(n)``` должен вернуть то же, что будет возвращать ```getTable(n)```.
```
getTable(n) == getTable(n);
createTable(f) == getTable(f);
```