2013-05-13 4 views
0

Является ли Javascript-прототипированием в любом случае достижимым, даже используя Reflection? Могу ли я обернуть свой объект внутри другого, просто чтобы расширить его функциональность одним или двумя способами, не проводя все свои исходные неавтоматические методы в класс обертки, или extends - это все, что я получаю?Прототипирование в Java вместо расширения

+0

я думаю, вы могли бы 'extend' класс или, возможно, обернуть его в [Decorator] (http://en.wikipedia.org/wiki/Decorator_pattern) –

+1

вы можете использовать динамический прокси y API ('java.lang.reflect.Proxy') или библиотеки типа' cglib', которые помогут выполнить то, что вы пытаетесь сделать. Но во всех случаях это будет не так просто, как в «JavaScript». Отражение в «Java» всегда является большой болью, особенно когда вы использовали мир прототипов программирования! – Vadim

+0

Я думаю, вы можете поставить их в ответ. –

ответ

0

Я не думаю, что вы можете это сделать на Java. Вы можете хоть в Groovy, используя metaclasses

String.metaClass.world = { 
    return delegate + " world!" 
} 

println "Hello".world() 
1

Если вы ищете методы расширения, вы можете попробовать Xtend. Xtend - это язык, который компилируется в Java-код и исключает шаблонный код.

Следующий текст украден из Xtend Docs for extensions:

Добавляя расширение ключевого слова в поле, локальная переменная или объявление параметра, его методы экземпляра становятся методы расширения.

Представьте, что вы хотите иметь определенную функциональность слоя для класса Person. Скажем, вы находитесь в классе, подобном сервлету, и хотите, чтобы он сохранял Person, используя некоторый механизм сохранения. Предположим, что Person реализует общий интерфейс Entity. Вы могли бы иметь следующий интерфейс

interface EntityPersistence { 
    public save(Entity e); 
    public update(Entity e); 
    public delete(Entity e); 
} 

И если вы получили экземпляр этого типа (через заводской или зависимости инъекций или что когда-либо), как это:

class MyServlet { 
    extension EntityPersistence ep = Factory.get(typeof(EntityPersistence)) 
    ... 

} 

Вы можете сэкономить, обновлять и удалять любой объект, как это:

val Person person = ... 
person.save // calls ep.save(person) 
person.name = 'Horst' 
person.update // calls ep.update(person) 
person.delete // calls ep.delete(person)