Ваша первая реализация действительно хорошая.
Вы обязательно должны использовать наиболее абстрактный тип (IntegerProperty в вашем случае) везде, где можете.
Основная причина в том, что он позволяет вамизменить реализацию без необходимости изменения прототипа / определения ваших методов, и, следовательно, нет необходимости изменять любого вызывающего.
Подумайте о той же ситуации с Set и переходом от конкретного типа HashSet к LinkedHashSet.