Если бы у разных Фруктов было разное поведение роста, я бы не использовал if-else или enum, а вместо этого использовал бы объектно-ориентированный дизайн. Проблема со стилем if-else / enum (я считаю их эквивалентными в вашем примере) заключается в том, что они собирают поведение различных типов объектов в одном месте. Если вы добавляете новый фрукт, вам нужно каждый раз редактировать свой if-else / enum. Это нарушает принцип открытый-закрытый .
Подумайте, было ли у ваших 4 плодов 3 поведения (например, расти, созревать, гнить). У вас будет if-else / enum для каждого поведения, каждое из которых содержит 4 ссылки на фрукты. Теперь рассмотрите возможность добавления 5-го фрукта, вы должны отредактировать 3 разных блока if-else / enum. Поведение арбуза не имеет ничего общего с яблоком, но они в одном куске кода. Теперь рассмотрите возможность добавления нового фруктового поведения (например, аромат) - вы должны создать новый if-else / enum, который имеет те же проблемы.
Я считаю, что правильное решение в большинстве случаев - использовать классы (например, интерфейс / базовый класс Fruit с одним классом реализации на фрукт) и поместить поведение в каждый класс вместо того, чтобы собирать все в одном месте. Поэтому, когда вы добавляете новый фрукт, единственный изменяемый код состоит в том, что пишется новый класс фруктов.
Существует хорошо известный рефакторинг, который вы можете использовать, чтобы взять существующий код и перенести его в то, о чем я говорю. Это называется Заменить условное на полиморфизм .