Вот другой ответ Ruby, эти лямбды использования:
(a=lambda{a.call}).call
Эти типы являются «семантическими». Они присутствуют в Java API для паритета с Python API. В API Python они определяют особое поведение в отношении метода .to_xml () - например, PhoneNumberProperty сериализуется следующим образом:
<property name="foo" type="gd:phonenumber"><gd:phoneNumber>12345-678</gd:phoneNumber></property>
Я думаю, что они в основном существуют для того, чтобы охватить общие случаи и сэкономить время разработчиков. Если во многих приложениях используется поле с номером телефона, зачем требовать от каждого разработчика писать их? Разработчик по-прежнему может писать свои собственные, если ему нужно / он хочет.
Не уверен насчет java, но в питоне следующая модель/код (тестировался на сервере dev) будет бросать BadValueError с сообщением "Invalid URL: stackoverflow.com"
class foo(db.model):
link = db.LinkProperty()
bar = foo()
bar.link = 'stackoverflow.com'
While:
bar.link = 'http://stackoverflow.com'
Works fine.
Я не тестировал, но другие свойства также могут делать или не делать валидацию.
.В основном использование этих типов в ваших моделях позволяет добавлять косвенные метаданные в ваш код. Это может быть полезно, если вы работаете с любым универсальным рендерером для ваших классов моделей или выполняете валидацию пользовательского ввода на ваших моделях.
Например, если вы используете тип PhoneNumber для поля с именем userNumber, то рендер, основанный на рефлексии, может понять, что он должен автоматически назначать соответствующий валидатор текстовому полю, которое будет его представлять.
Regards, Павел.