Не вижу проблем с дизайном. Вам необходимо добавить платеж в набор платежей. После этого вам необходимо назначить выбранный платеж Клиенту.
Если вы используете набор, вам не нужно использовать:
if(!customer.getPayments().contains(payment) ){
потому что набор не позволяет добавлять дубликаты элементов.
Также я не вижу причин для этого:
if(!customer.getCurrentlySelectedPayment().equals(payment)){
Вы можете просто установить его, и вам не нужно оценивать, если текущая выбранная оплата не равна.
Я сталкивался с похожими ситуациями, когда вам нужно сначала добавить элементы к родителю, а затем назначить один из этих элементов одному из атрибутов родителя. Я решил это так, как вы сделали, вместо того, чтобы иметь флаг (атрибут true / false) в childs.
Я думаю, то, что вы делаете, это правильный путь. Я думаю, что флаг, такой как, например, в этом случае атрибут с именем selectedPayment в поле Payment, не является подходящим атрибутом для объекта. Зачем? Потому что сначала это атрибут Клиента, а не сам Платеж. Во-вторых, когда вы хотите изменить selectedPayment, вам нужно получить selectedPayment из дочернего объекта, удалить флаг и назначить флаг новому дочернему элементу, чего можно было бы избежать, если бы вы просто создали атрибут в родительском объекте.