1 хорошо, если вы не планируете добавлять много / любые новые типы И вам не нужно позволять третьим сторонам добавлять свои собственные типы. Вероятно, я бы использовал enum, а не int.
Я не вижу большого преимущества от 2 до 4. 4 является универсальным, хотя вы можете захотеть включить getValueType () даже в общем случае, чтобы вы могли иметь код, запрашивающий тип во время выполнения, часто полезный.
Я не думаю, что 3 - правильный путь, если только контент вашей модели не поддерживает извлечение разными способами (как это делает JDBC), но я не думаю, что это так.
Из прошлого опыта я бы сделал 4 и добавил к нему getValueType ().