Все дело в привязках
Было время, когда я считал свойства просто синтаксическим сахаром (то есть помогал разработчику, заставляя их печатать немного меньше). По мере того, как я все больше и больше занимался разработкой графического интерфейса и начал использовать связывающие фреймворки (JGoodies, JSR295), я обнаружил, что свойства уровня языка намного, намного больше, чем синтаксический сахар.
В сценарии связывания вы, по сути, определяете правила, в которых говорится, что «свойство X объекта A всегда должно быть равно свойству Y объекта B». Сокращенное обозначение: A.x <-> B.y
Теперь представьте, как бы вы на самом деле написали библиотеку связывания на Java. В настоящее время абсолютно невозможно напрямую ссылаться на «x» или «y» как на языковые примитивы. Вы можете ссылаться на них только как на строки (и получить к ним доступ через отражение). По сути, A. "x" <-> B. "y"
Это вызывает огромные проблемы при рефакторинге кода.
Существуют дополнительные соображения, в том числе правильная реализация уведомлений об изменениях свойств. Если вы посмотрите на мой код, каждому благословенному сеттеру требуется минимум 3 строки, чтобы сделать что-то невероятно простое. Плюс одна из этих трех строк включает еще одну строку:
public void setFoo(Foo foo){
Foo old = getFoo();
this.foo = foo;
changeSupport.firePropertyChange("foo", old, foo);
}
все эти плавающие строки - полный кошмар.
Теперь, представьте, если бы собственность была языком первого класса на языке. Это начинает предоставлять почти бесконечные возможности (например, представьте себе, что нужно напрямую зарегистрировать слушателя с помощью свойства вместо того, чтобы гадить с помощью PropertyChangeSupport и его 3 загадочных методов, которые должны быть добавлены к каждому классу). Представьте себе, что вы можете передать само свойство (не значение свойства, а объект Property) в связующую среду.
Для разработчиков веб-уровня представьте себе веб-инфраструктуру, которая может создавать свои собственные значения идентификатора формы из имен самих свойств (что-то вроде registerFormProperties (myObject.firstname, myObject.lastname, someOtherObject.amount), чтобы разрешить прием туда и обратно заполнение значений свойств объекта при отправке формы обратно на сервер. Сейчас для этого вам нужно будет передать строки, и рефакторинг станет головной болью (рефакторинг фактически становится пугающим, если вы полагаетесь на строки и рефлексию соединяйте вещи).
Так или иначе, для тех из нас, кто имеет дело с динамическим обновлением данных с помощью связывания, свойства являются крайне необходимой функцией в языке - намного больше, чем просто синтаксический сахар.