Я думаю, что запах круговой зависимости показывает скорее архитектурную / дизайнерскую проблему, которая не должна быть решена с помощью DI, позднего ограничения, слабой связи или любой другой формы дополнительного слоя абстракции. Хотя они все очень хорошие механизмы, но не решают проблему под ними.
Коротко: я думаю, что ChessWorld содержит слишком много обязанностей . Если вы разделите их, вы, вероятно, обнаружите, что зависимости являются обязанностями, лучше подходящими в отдельном модуле.
Длинное объяснение: я попытаюсь привести пример того, как я бы осуществил его рефакторинг, хотя это сложно, потому что я действительно не являюсь полной проблемной областью.
ПРИМЕЧАНИЕ. Я не знаком с Java, поэтому могу неправильно понять значение импорта и переноса.
Но, как я понимаю, зависимости выглядят примерно так:
Gui <- ChessWidget <- ChessWorld <- CellButton <- Cell
<- Board <- Piece <- Player
<- Players <- ChessWorld
ИМХО, проблема в том, что в ChessWorld слишком много разных обязанностей. Поддерживать список игроков, вероятно, лучше в отдельном модуле, таком как PlayerList, RegisteredUsers или OnlineUsers или что-то подобное. После этого рефакторинга ваши зависимости будут меняться следующим образом:
Gui <- ChessWidget <- ChessWorld <- CellButton <- Cell
<- Board <- Piece <- Player
<- Playerlist <- Player
PlayerList - это, вероятно, то, что вы бы имели в модуле плеера. Теперь Chessworld зависит от модуля игрока, а не в другом направлении.
Я не уверен, идеально ли это соответствует вашим намерениям, но мне очень интересно это обсудить, поэтому, пожалуйста, прокомментируйте.