<?xml version='1.0' encoding='utf-8' ?>
<!--  If you are running a bot please visit this policy page outlining rules you must respect. http://www.livejournal.com/bots/  -->
<rss version='2.0' xmlns:lj='http://www.livejournal.org/rss/lj/1.0/' xmlns:media='http://search.yahoo.com/mrss/' xmlns:atom10='http://www.w3.org/2005/Atom'>
<channel>
  <title>Nothing left to do but smile, smile, smile</title>
  <link>http://ogolberg.livejournal.com/</link>
  <description>Nothing left to do but smile, smile, smile - LiveJournal.com</description>
  <lastBuildDate>Thu, 09 Apr 2009 22:48:27 GMT</lastBuildDate>
  <generator>LiveJournal / LiveJournal.com</generator>
  <lj:journal>ogolberg</lj:journal>
  <lj:journalid>8353937</lj:journalid>
  <lj:journaltype>personal</lj:journaltype>
  <atom10:link rel='hub' href='http://pubsubhubbub.appspot.com/' />
  <image>
    <url>http://l-userpic.livejournal.com/73350791/8353937</url>
    <title>Nothing left to do but smile, smile, smile</title>
    <link>http://ogolberg.livejournal.com/</link>
    <width>100</width>
    <height>100</height>
  </image>

<item>
  <guid isPermaLink='true'>http://ogolberg.livejournal.com/47312.html</guid>
  <pubDate>Thu, 09 Apr 2009 22:48:27 GMT</pubDate>
  <title>Мыло, матрешки и enterprise</title>
  <link>http://ogolberg.livejournal.com/47312.html</link>
  <description>Вопрос на засыпку: где в нижеследующем фрагменте SOAP-сообщения самый большой WTF? Минута пошла.

&lt;div style=&quot;overflow-x: scroll&quot;&gt;&lt;pre&gt;&lt;tt&gt;&lt;b&gt;&lt;font color=&quot;#000080&quot;&gt;&amp;lt;?xml&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#009900&quot;&gt;version&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt;&lt;font color=&quot;#FF0000&quot;&gt;&quot;1.0&quot;&lt;/font&gt; &lt;font color=&quot;#009900&quot;&gt;encoding&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt;&lt;font color=&quot;#FF0000&quot;&gt;&quot;utf-8&quot;&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#000080&quot;&gt;?&amp;gt;&lt;/font&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;&amp;lt;soap:Envelope&lt;/font&gt;&lt;/b&gt;...
&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;&amp;lt;GetDataSourceNameListResponse&amp;gt;&lt;/font&gt;&lt;/b&gt;
  &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;&amp;lt;GetDataSourceNameListResult&amp;gt;&lt;/font&gt;&lt;/b&gt;&lt;b&gt;&lt;font color=&quot;#000080&quot;&gt;&amp;amp;lt;&lt;/font&gt;&lt;/b&gt;?xml version=&quot;1.0&quot; encoding=&quot;utf-16&quot;?&lt;b&gt;&lt;font color=&quot;#000080&quot;&gt;&amp;amp;gt;&lt;/font&gt;&lt;/b&gt;
&lt;b&gt;&lt;font color=&quot;#000080&quot;&gt;&amp;amp;lt;&lt;/font&gt;&lt;/b&gt;AxStringArray xmlns:xsd=&quot;http://www.w3.org/2001/XMLSchema&quot; xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot; xmlns:ax=&quot;http://www.emc.com/ax&quot; xmlns=&quot;http://www.emc.com/ax&quot;&lt;b&gt;&lt;font color=&quot;#000080&quot;&gt;&amp;amp;gt;&lt;/font&gt;&lt;/b&gt;
  &lt;b&gt;&lt;font color=&quot;#000080&quot;&gt;&amp;amp;lt;&lt;/font&gt;&lt;/b&gt;ax:String&lt;b&gt;&lt;font color=&quot;#000080&quot;&gt;&amp;amp;gt;&lt;/font&gt;&lt;/b&gt;AX-USI&lt;b&gt;&lt;font color=&quot;#000080&quot;&gt;&amp;amp;lt;&lt;/font&gt;&lt;/b&gt;/ax:String&lt;b&gt;&lt;font color=&quot;#000080&quot;&gt;&amp;amp;gt;&lt;/font&gt;&lt;/b&gt;
  &lt;b&gt;&lt;font color=&quot;#000080&quot;&gt;&amp;amp;lt;&lt;/font&gt;&lt;/b&gt;ax:String&lt;b&gt;&lt;font color=&quot;#000080&quot;&gt;&amp;amp;gt;&lt;/font&gt;&lt;/b&gt;AX-GRAD&lt;b&gt;&lt;font color=&quot;#000080&quot;&gt;&amp;amp;lt;&lt;/font&gt;&lt;/b&gt;/ax:String&lt;b&gt;&lt;font color=&quot;#000080&quot;&gt;&amp;amp;gt;&lt;/font&gt;&lt;/b&gt;
  &lt;b&gt;&lt;font color=&quot;#000080&quot;&gt;&amp;amp;lt;&lt;/font&gt;&lt;/b&gt;ax:String&lt;b&gt;&lt;font color=&quot;#000080&quot;&gt;&amp;amp;gt;&lt;/font&gt;&lt;/b&gt;AX-OVPREA&lt;b&gt;&lt;font color=&quot;#000080&quot;&gt;&amp;amp;lt;&lt;/font&gt;&lt;/b&gt;/ax:String&lt;b&gt;&lt;font color=&quot;#000080&quot;&gt;&amp;amp;gt;&lt;/font&gt;&lt;/b&gt;
  &lt;b&gt;&lt;font color=&quot;#000080&quot;&gt;&amp;amp;lt;&lt;/font&gt;&lt;/b&gt;ax:String&lt;b&gt;&lt;font color=&quot;#000080&quot;&gt;&amp;amp;gt;&lt;/font&gt;&lt;/b&gt;AX-CLAS&lt;b&gt;&lt;font color=&quot;#000080&quot;&gt;&amp;amp;lt;&lt;/font&gt;&lt;/b&gt;/ax:String&lt;b&gt;&lt;font color=&quot;#000080&quot;&gt;&amp;amp;gt;&lt;/font&gt;&lt;/b&gt;
&lt;b&gt;&lt;font color=&quot;#000080&quot;&gt;&amp;amp;lt;&lt;/font&gt;&lt;/b&gt;/AxStringArray&lt;b&gt;&lt;font color=&quot;#000080&quot;&gt;&amp;amp;gt;&lt;/font&gt;&lt;/b&gt;
  &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;&amp;lt;/GetDataSourceNameListResult&amp;gt;&lt;/font&gt;&lt;/b&gt;
&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;&amp;lt;/GetDataSourceNameListResponse&amp;gt;&lt;/font&gt;&lt;/b&gt;
...
&lt;/tt&gt;&lt;/pre&gt;&lt;/div&gt;

Это — EMC Documentum AppXtender с его неповторимым public API. Несколько строк кода с использованием JAXB скрыли это мракобесие от моих милых POJO, но, как в том анекдоте про ложки, осадок неприятный остался.
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ответ: (вопрос был с на*бкой) само сообщение в utf-8, а XML-матрешка объявлена как utf-16.</description>
  <comments>http://ogolberg.livejournal.com/47312.html</comments>
  <category>wtf</category>
  <lj:music>Tom Waits - Jockey Full of Bourbon</lj:music>
  <media:title type="plain">Tom Waits - Jockey Full of Bourbon</media:title>
  <lj:mood>okay</lj:mood>
  <lj:security>public</lj:security>
  <lj:reply-count>2</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://ogolberg.livejournal.com/47034.html</guid>
  <pubDate>Sat, 27 Dec 2008 18:20:58 GMT</pubDate>
  <title>Пост-Xmas</title>
  <link>http://ogolberg.livejournal.com/47034.html</link>
  <description>Когда в каждом супермаркете играет «Have yourself a merry little Christmas», а на выходе из него мини-хор бомжей так органично поет «...and since we&apos;ve got no place to go, let it snow, let it snow, let it snow...» а капелла, моей любимой рождественской песней остается «My Favorite Things». Кто ее только не исполнял — от Энди Уильямса до Тупака, и в обилии интерпретаций собственно и есть ее прелесть. &lt;br /&gt;&lt;br /&gt;Вот «&lt;a href=&quot;http://www.youtube.com/watch?v=vwLrUgJlung&quot;&gt;оригинал&lt;/a&gt;» из фильма Sound of Music. В кавычках потому что это — адаптация одноименного мюзикла, дебютировавшего на Бродвее на шесть лет раньше. &lt;br /&gt;&lt;br /&gt;С &lt;a href=&quot;http://www.dailymotion.com/video/xez60_john-coltrane-my-favorite-things-19_music&quot;&gt;легкой руки&lt;/a&gt; и других гениальных частей тела Колтрeйна композиция стала джазовым стандартом.&lt;br /&gt;&lt;br /&gt;Вот, к примеру, Дэвид Либман с &lt;a href=&quot;http://www.youtube.com/watch?v=jjq6rcEZ-J4&quot;&gt;версией&lt;/a&gt; пободрее. Последние двое конечно джазовые величины разного калибра, но в разное время оба играли у Майлса.&lt;br /&gt;&lt;br /&gt;А хотите шансон — смотрите «&lt;a href=&quot;http://www.youtube.com/watch?v=ZfuHBoxF2Zc&quot;&gt;взрослый вариант&lt;/a&gt;» для разнообразия. &lt;br /&gt;&lt;br /&gt;Ну и самый &lt;a href=&quot;http://www.youtube.com/watch?v=EjAX9w74TmA&quot;&gt;эпический перфоманс&lt;/a&gt;: два отвязных японца с прозвищами «Гонсалез» и «Тити» в сопровождении куми-дайко и заметной струнной секции.</description>
  <comments>http://ogolberg.livejournal.com/47034.html</comments>
  <category>музыка</category>
  <lj:music>The Dave Brubeck Quartet - Take Five</lj:music>
  <media:title type="plain">The Dave Brubeck Quartet - Take Five</media:title>
  <lj:mood>peaceful</lj:mood>
  <lj:security>public</lj:security>
  <lj:reply-count>2</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://ogolberg.livejournal.com/45746.html</guid>
  <pubDate>Sun, 28 Sep 2008 18:09:28 GMT</pubDate>
  <title>Static Typing</title>
  <link>http://ogolberg.livejournal.com/45746.html</link>
  <description>&lt;img src=&quot;http://img265.imageshack.us/img265/1853/beetlexb1.png&quot; /&gt;

&lt;p style=&quot;text-transform: uppercase; font-size: 75%;&quot;&gt;Disclaimer: taking pictures while driving is dangerous; don&apos;t try this at home&lt;/p&gt;</description>
  <comments>http://ogolberg.livejournal.com/45746.html</comments>
  <category>java</category>
  <category>фото</category>
  <category>c++</category>
  <lj:music>Radiohead - Reckoner</lj:music>
  <media:title type="plain">Radiohead - Reckoner</media:title>
  <lj:mood>calm</lj:mood>
  <lj:security>public</lj:security>
  <lj:reply-count>1</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://ogolberg.livejournal.com/45458.html</guid>
  <pubDate>Mon, 11 Aug 2008 04:52:17 GMT</pubDate>
  <title>Тоже о любви к стейкам</title>
  <link>http://ogolberg.livejournal.com/45458.html</link>
  <description>Командировка в Иллинойсе, мы по магистрали-294 все больше удаляемся на юг от Чикаго. Самое время для сытного ужина после перелета, пытаемся найти подходящее место через iPhone, задалбливаемся. Тут приходится в очередной раз остановиться, чтобы отдать мзду (80 центов) за платный участок дороги. Спрашиваем у двух девушек-операторов, где в окрестностях можно найти хороший стейк. Между ними завязывается спор, всплывают одни за другими названия стейкхаусов. За нами стоит колонна машин, которая через некоторое время начинает неловко сигналить (все же это Средний Запад — в Бостоне уже, похоже, пошли бы бить морду и нам, и девушкам). Собиратели дорожной дани сходятся в итоге на одном месте, куда мы и отправляемся.&lt;br /&gt;— You think we can trust them with our dinner? — спрашивает коллега&lt;br /&gt;— Well, they seemed well-fed... — политкорректно намекает другой на уж очень сочные формы девушек&lt;br /&gt;— This is America, everyone is well-fed.&lt;br /&gt;Пятнадцать минут, пара нарушений правил дорожного движения, и вот мы уже рассматриваем меню. Добротное место — все порции мяса кроме filet mignon и New York strip подаются по 32 унции (чуть меньше килограмма) — практически целая корова на тарелке. New York strip, medium rare, сочный, сделанный как надо, и вот уже можно считать, что день удался. А, значит, с утра все бизнес-вопросы будут решаться веселее.</description>
  <comments>http://ogolberg.livejournal.com/45458.html</comments>
  <category>работа</category>
  <category>хавчик</category>
  <lj:music>Iron &amp; Wine - Freedom Hangs Like Heaven</lj:music>
  <media:title type="plain">Iron &amp; Wine - Freedom Hangs Like Heaven</media:title>
  <lj:mood>gloomy</lj:mood>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://ogolberg.livejournal.com/45214.html</guid>
  <pubDate>Sat, 09 Aug 2008 15:00:37 GMT</pubDate>
  <title>Friday Night</title>
  <link>http://ogolberg.livejournal.com/45214.html</link>
  <description>08/08/08 @ 8pm: дилемма &lt;em&gt;Gogol Bordello&lt;/em&gt; @ Providence, RI vs. &lt;em&gt;Захар Май&lt;/em&gt; @ Cambridge, MA разрешилась в пользу последнего. О чем я совсем не пожалел. Среди забавных впечатлений: куча разношерстной русской публики от «инженерной интеллигенции» в очках и выглаженных брюках до «гопников» в кожаных пиджаках и кепках, стойкий запах марихуаны по всему бару еще до начала перфоманса, рычащий для затравки «My hips don&apos;t lie» собственно Захар Борисович, стреляющий у него сигареты и пританцовывающий под «один раз в год козу ебут» профессор MIT и, наконец, тайская барменша, сказавшая мне «сипасиба» за чаевые.</description>
  <comments>http://ogolberg.livejournal.com/45214.html</comments>
  <lj:music>Depeche Mode - Strangelove</lj:music>
  <media:title type="plain">Depeche Mode - Strangelove</media:title>
  <lj:mood>awake</lj:mood>
  <lj:security>public</lj:security>
  <lj:reply-count>1</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://ogolberg.livejournal.com/45019.html</guid>
  <pubDate>Sun, 03 Aug 2008 02:11:06 GMT</pubDate>
  <title>Интервью</title>
  <link>http://ogolberg.livejournal.com/45019.html</link>
  <description>­— Here, wanna interview this guy? — бросил мне уже бывший начальник чье-то резюме на стол.&lt;br /&gt;— But I have no idea what to do...&lt;br /&gt;— Good, gotta start someday anyway.&lt;br /&gt;&lt;br /&gt;В общем, я провел свое первое собеседование. Было очень забавно оказаться по другую сторону барьера — я все больше вел технические разговоры, а под конец дал кандидату задачку. Лас Вегас алгоритм он таки нашел, но вот с подсчетом ожидаемого времени у него не срослось. Во-первых — то, что он в конце концов написал на доске, оказалось формулой не ожидаемого времени, а вероятности того, что алгоритм когда-нибудь завершится. Хотя резюме говорило, что в его магистрской инженерной программе присутствовал «Analysis of Probabilistic Systems». Возможно, если бы он ее досчитал и получил 1, то почуял бы, что что-то не так. Но ... во-вторых, он-то ее и не досчитал, хотя это была просто сумма геометрической прогрессии. С другой стороны — половина функций в финансовых калькуляторах собственно и считают такие суммы, называя их все на три буквы — NPV, APR, IRR, а ими пользуются люди, которые считают наше с вами бабло, так что это еще не так страшно.</description>
  <comments>http://ogolberg.livejournal.com/45019.html</comments>
  <category>жизнь</category>
  <category>работа</category>
  <category>забавно</category>
  <category>математика</category>
  <lj:music>Gipsy Kings - Hotel California</lj:music>
  <media:title type="plain">Gipsy Kings - Hotel California</media:title>
  <lj:mood>blank</lj:mood>
  <lj:security>public</lj:security>
  <lj:reply-count>7</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://ogolberg.livejournal.com/44612.html</guid>
  <pubDate>Sat, 02 Aug 2008 17:53:05 GMT</pubDate>
  <title>Запоздалое</title>
  <link>http://ogolberg.livejournal.com/44612.html</link>
  <description>Ходил на «The Dark Knight» в день после премьеры — десять минут до начала сеанса, а, значит, больше получаса до, собственно, фильма, но зал почти забит. Кое-как протискиваемся на нормальные места... Чувствуется ажиотаж; как оказалось — совсем не пустой. Cristian Bale как всегда на уровне. Как сказал приятель после «Batman Begins» — he&apos;s evil fucking good (возможно даже настолько, что ему удастся реанимировать совсем &lt;a href=&quot;http://en.wikipedia.org/wiki/Terminator_Salvation&quot;&gt;дохлый franchise&lt;/a&gt;). Но Joker, Joker — это роль, после которой можно уходить. Heath Ledger выдал на голову лучшую игру, чем предыдущая инкарнация — Jack Nicholson, и это о многом говорит. Перед съемками он жил один в отеле неделю и входил в роль. Страшный, смешной, с адским чувством юмора. А голос — то, что потеряется при дубляже — совсем не из этого мира, как Tom Waits, но мрачный и злой. Глубоко жаль, что это была его последняя полная роль. Но радует, что в последнее время начали более серьезно экранизировать комиксы, потому что среди них много на самом деле достойных произведений, и только из-за дурацкой анимации, фильмов и режиссеров как Tim Burton о них думают, как о чем-то детско-глупом. Кстати, перед «The Dark Knight» увидел preview выходящего в следующем году «Watchmen» — адаптации одноименной и одной из самых культовых и психологически глубоких серий комиксов. Создал ее, кстати, Alan Moore, на счету которого также замечательные «V for Vendetta» и «From Hell». По первой сняли совершенно непотребный фильм, а по второй — наоборот очень хороший. Посмотрим, что получится с «Watchmen».</description>
  <comments>http://ogolberg.livejournal.com/44612.html</comments>
  <category>кино</category>
  <lj:music>Tom Waits - Chocolate Jesus</lj:music>
  <media:title type="plain">Tom Waits - Chocolate Jesus</media:title>
  <lj:mood>calm</lj:mood>
  <lj:security>public</lj:security>
  <lj:reply-count>4</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://ogolberg.livejournal.com/44360.html</guid>
  <pubDate>Sat, 14 Jun 2008 23:22:22 GMT</pubDate>
  <title>Going down to ...</title>
  <link>http://ogolberg.livejournal.com/44360.html</link>
  <description>&lt;p&gt;
&lt;img src=&quot;http://img174.imageshack.us/img174/3048/spzf1.png&quot; /&gt;
&lt;/p&gt;</description>
  <comments>http://ogolberg.livejournal.com/44360.html</comments>
  <category>фото</category>
  <lj:music>Chumbawamba - Tubthumping</lj:music>
  <media:title type="plain">Chumbawamba - Tubthumping</media:title>
  <lj:mood>lonely</lj:mood>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://ogolberg.livejournal.com/44032.html</guid>
  <pubDate>Sat, 31 May 2008 02:00:33 GMT</pubDate>
  <title>Iron Man?</title>
  <link>http://ogolberg.livejournal.com/44032.html</link>
  <description>Вот &lt;a href=&quot;http://web.mit.edu/newsoffice/2008/gulak-tt0514.html&quot;&gt;это&lt;/a&gt; — будущий Tony Stark. Да.</description>
  <comments>http://ogolberg.livejournal.com/44032.html</comments>
  <category>college</category>
  <lj:music>David Bowie - &quot;Heroes&quot;</lj:music>
  <media:title type="plain">David Bowie - &quot;Heroes&quot;</media:title>
  <lj:mood>calm</lj:mood>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://ogolberg.livejournal.com/44025.html</guid>
  <pubDate>Fri, 30 May 2008 03:49:17 GMT</pubDate>
  <title>Multiple dispatch</title>
  <link>http://ogolberg.livejournal.com/44025.html</link>
  <description>Многие вводные статьи и учебники по «попсовому» объектно-ориентированному программированию (где под «попсовым» подразумевается то, что мы имеем, например, в C++ и Java) содержат примеры с классами «фигурка», «треугольничек» и так далее. Примеры, кстати, получаются очень стройными, но к сожалению элегантность редко просачивается из учебников в реальный код. Тема этого поста — &lt;em&gt;multiple dispatch&lt;/em&gt; — фундаментальная возможность, которая отсутствует во многих распространенных языках, называющих себя объектно-ориентированными. Я тоже выберу популярный подход с «фигурками» и «треугольничками». Мои примеры — весьма абстрактные, но том или другом виде встречаются очень часто в реальных системах. &lt;a name=&quot;cutid1&quot;&gt;&lt;/a&gt; Итак, предположим, что у нас есть типы &lt;em&gt;окружность&lt;/em&gt; и &lt;em&gt;перенос&lt;/em&gt;, и нашей программе на Java нужно второе применять к первому.

    &lt;pre&gt;
&lt;span style=&quot;color: #a020f0;&quot;&gt;class&lt;/span&gt; &lt;span style=&quot;color: #228b22;&quot;&gt;Circle&lt;/span&gt; {
      &lt;span style=&quot;color: #a020f0;&quot;&gt;final&lt;/span&gt; &lt;span style=&quot;color: #228b22;&quot;&gt;int&lt;/span&gt; &lt;span style=&quot;color: #b8860b;&quot;&gt;x&lt;/span&gt;, &lt;span style=&quot;color: #b8860b;&quot;&gt;y&lt;/span&gt;, &lt;span style=&quot;color: #b8860b;&quot;&gt;r&lt;/span&gt;;
      &lt;span style=&quot;color: #a020f0;&quot;&gt;public&lt;/span&gt; Circle(&lt;span style=&quot;color: #228b22;&quot;&gt;int&lt;/span&gt; &lt;span style=&quot;color: #b8860b;&quot;&gt;x&lt;/span&gt;, &lt;span style=&quot;color: #228b22;&quot;&gt;int&lt;/span&gt; &lt;span style=&quot;color: #b8860b;&quot;&gt;y&lt;/span&gt;, &lt;span style=&quot;color: #228b22;&quot;&gt;int&lt;/span&gt; &lt;span style=&quot;color: #b8860b;&quot;&gt;r&lt;/span&gt;) {
             &lt;span style=&quot;color: #a020f0;&quot;&gt;this&lt;/span&gt;.x = x; &lt;span style=&quot;color: #a020f0;&quot;&gt;this&lt;/span&gt;.y = y; &lt;span style=&quot;color: #a020f0;&quot;&gt;this&lt;/span&gt;.r = r;                             
      }
}

&lt;span style=&quot;color: #a020f0;&quot;&gt;class&lt;/span&gt; &lt;span style=&quot;color: #228b22;&quot;&gt;Translation&lt;/span&gt; {
      &lt;span style=&quot;color: #a020f0;&quot;&gt;final&lt;/span&gt; &lt;span style=&quot;color: #228b22;&quot;&gt;int&lt;/span&gt; &lt;span style=&quot;color: #b8860b;&quot;&gt;x&lt;/span&gt;, &lt;span style=&quot;color: #b8860b;&quot;&gt;y&lt;/span&gt;;
      &lt;span style=&quot;color: #a020f0;&quot;&gt;public&lt;/span&gt; Translation(&lt;span style=&quot;color: #228b22;&quot;&gt;int&lt;/span&gt; &lt;span style=&quot;color: #b8860b;&quot;&gt;x&lt;/span&gt;, &lt;span style=&quot;color: #228b22;&quot;&gt;int&lt;/span&gt; &lt;span style=&quot;color: #b8860b;&quot;&gt;y&lt;/span&gt;) {
             &lt;span style=&quot;color: #a020f0;&quot;&gt;this&lt;/span&gt;.x = x; &lt;span style=&quot;color: #a020f0;&quot;&gt;this&lt;/span&gt;.y = y;
      }
}

&lt;span style=&quot;color: #a020f0;&quot;&gt;class&lt;/span&gt; &lt;span style=&quot;color: #228b22;&quot;&gt;Program&lt;/span&gt; {
      &lt;span style=&quot;color: #228b22;&quot;&gt;Circle&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;transform&lt;/span&gt;(&lt;span style=&quot;color: #228b22;&quot;&gt;Circle&lt;/span&gt; &lt;span style=&quot;color: #b8860b;&quot;&gt;c&lt;/span&gt;, &lt;span style=&quot;color: #228b22;&quot;&gt;Translation&lt;/span&gt; &lt;span style=&quot;color: #b8860b;&quot;&gt;t&lt;/span&gt;) {
             &lt;span style=&quot;color: #a020f0;&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;color: #a020f0;&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color: #228b22;&quot;&gt;Circle&lt;/span&gt;(c.x + t.x, c.y + t.y, c.r);
      }
}
&lt;/pre&gt;

Пока все тривиально. Теперь предположим, что кроме переноса мы также имеем тип — операцию &lt;em&gt;вертикального отражения&lt;/em&gt;.

    &lt;pre&gt;
&lt;span style=&quot;color: #a020f0;&quot;&gt;class&lt;/span&gt; &lt;span style=&quot;color: #228b22;&quot;&gt;VFlip&lt;/span&gt; {
      &lt;span style=&quot;color: #a020f0;&quot;&gt;final&lt;/span&gt; &lt;span style=&quot;color: #228b22;&quot;&gt;int&lt;/span&gt; &lt;span style=&quot;color: #b8860b;&quot;&gt;y&lt;/span&gt;;
      &lt;span style=&quot;color: #a020f0;&quot;&gt;public&lt;/span&gt; VFlip(&lt;span style=&quot;color: #228b22;&quot;&gt;int&lt;/span&gt; &lt;span style=&quot;color: #b8860b;&quot;&gt;y&lt;/span&gt;) {
             &lt;span style=&quot;color: #a020f0;&quot;&gt;this&lt;/span&gt;.y = y;
      }
}
&lt;/pre&gt;

Соответственно добавим новый метод в нашу программу. 

    &lt;pre&gt;
&lt;span style=&quot;color: #a020f0;&quot;&gt;class&lt;/span&gt; &lt;span style=&quot;color: #228b22;&quot;&gt;Program&lt;/span&gt; {
      &lt;span style=&quot;color: #228b22;&quot;&gt;Circle&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;transform&lt;/span&gt;(&lt;span style=&quot;color: #228b22;&quot;&gt;Circle&lt;/span&gt; &lt;span style=&quot;color: #b8860b;&quot;&gt;c&lt;/span&gt;, &lt;span style=&quot;color: #228b22;&quot;&gt;Translation&lt;/span&gt; &lt;span style=&quot;color: #b8860b;&quot;&gt;t&lt;/span&gt;) {
             &lt;span style=&quot;color: #a020f0;&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;color: #a020f0;&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color: #228b22;&quot;&gt;Circle&lt;/span&gt;(c.x + t.x, c.y + t.y, c.r);
      }
      &lt;span style=&quot;color: #228b22;&quot;&gt;Circle&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;transform&lt;/span&gt;(&lt;span style=&quot;color: #228b22;&quot;&gt;Circle&lt;/span&gt; &lt;span style=&quot;color: #b8860b;&quot;&gt;c&lt;/span&gt;, &lt;span style=&quot;color: #228b22;&quot;&gt;VFlip&lt;/span&gt; &lt;span style=&quot;color: #b8860b;&quot;&gt;t&lt;/span&gt;) {
             &lt;span style=&quot;color: #a020f0;&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;color: #a020f0;&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color: #228b22;&quot;&gt;Circle&lt;/span&gt;(c.x, 2*t.y - c.y, c.r);
      }
}
&lt;/pre&gt;

Однако, не все так просто. Представим, что нам нужно применить к фигуре серию операций, которая, естественно будет храниться в коллекции. Для этого заведем базовый тип &lt;span style=&quot;color: #228b22;&quot;&gt;Transform&lt;/span&gt;.

&lt;pre&gt;
&lt;span style=&quot;color: #a020f0;&quot;&gt;class&lt;/span&gt; &lt;span style=&quot;color: #228b22;&quot;&gt;Translation&lt;/span&gt; &lt;span style=&quot;color: #a020f0;&quot;&gt;implements&lt;/span&gt; &lt;span style=&quot;color: #228b22;&quot;&gt;Transform&lt;/span&gt; { ...
&lt;span style=&quot;color: #a020f0;&quot;&gt;class&lt;/span&gt; VFlip &lt;span style=&quot;color: #a020f0;&quot;&gt;implements&lt;/span&gt; &lt;span style=&quot;color: #228b22;&quot;&gt;Transform&lt;/span&gt; { ...&lt;/pre&gt;

Также добавим следующий метод, отладки ради.

&lt;pre&gt;
&lt;span style=&quot;color: #228b22;&quot;&gt;Circle&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;transform&lt;/span&gt;(&lt;span style=&quot;color: #228b22;&quot;&gt;Circle&lt;/span&gt; &lt;span style=&quot;color: #b8860b;&quot;&gt;c&lt;/span&gt;, &lt;span style=&quot;color: #228b22;&quot;&gt;Transform&lt;/span&gt; &lt;span style=&quot;color: #b8860b;&quot;&gt;t&lt;/span&gt;) {
      &lt;span style=&quot;color: #a020f0;&quot;&gt;throw&lt;/span&gt; &lt;span style=&quot;color: #a020f0;&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color: #228b22;&quot;&gt;RuntimeException&lt;/span&gt;(&lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;Not implemented&quot;&lt;/span&gt;);
}
&lt;/pre&gt;

А теперь все-таки постараемся реализовать необходимый метод.

    &lt;pre&gt;
&lt;span style=&quot;color: #228b22;&quot;&gt;Circle&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;transform&lt;/span&gt;(&lt;span style=&quot;color: #228b22;&quot;&gt;Circle&lt;/span&gt; &lt;span style=&quot;color: #b8860b;&quot;&gt;c&lt;/span&gt;, Iterable&amp;lt;Transform&amp;gt; transforms) {
      &lt;span style=&quot;color: #228b22;&quot;&gt;Circle&lt;/span&gt; &lt;span style=&quot;color: #b8860b;&quot;&gt;result&lt;/span&gt; = c;
      &lt;span style=&quot;color: #a020f0;&quot;&gt;for&lt;/span&gt; (Transform t: transforms) result = transform(result, t);
      &lt;span style=&quot;color: #a020f0;&quot;&gt;return&lt;/span&gt; result;
}
&lt;/pre&gt;

Естественно, этот код не работает, потому что всегда вызывается метод &lt;span style=&quot;color: #0000ff;&quot;&gt;transform&lt;/span&gt;(&lt;span style=&quot;color: #228b22;&quot;&gt;Circle&lt;/span&gt;, &lt;span style=&quot;color: #228b22;&quot;&gt;Transform&lt;/span&gt;) который выдает исключение. Вот если бы только выполнение делегировалось методу в зависимости от реального, то есть runtime, типа операции... Собственно это делегирование и называется multiple dispatch или &lt;em&gt;мультиметодом&lt;/em&gt; и дает возможность специализировать функции по типам нескольких агрументов. Пока же нам придется немного поменять код.

    &lt;pre&gt;
&lt;span style=&quot;color: #228b22;&quot;&gt;Circle&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;transform&lt;/span&gt;(&lt;span style=&quot;color: #228b22;&quot;&gt;Circle&lt;/span&gt; &lt;span style=&quot;color: #b8860b;&quot;&gt;c&lt;/span&gt;, &lt;span style=&quot;color: #228b22;&quot;&gt;Transform&lt;/span&gt; &lt;span style=&quot;color: #b8860b;&quot;&gt;t&lt;/span&gt;) {
        &lt;span style=&quot;color: #a020f0;&quot;&gt;if&lt;/span&gt; (t &lt;span style=&quot;color: #a020f0;&quot;&gt;instanceof&lt;/span&gt; Translation) &lt;span style=&quot;color: #a020f0;&quot;&gt;return&lt;/span&gt; transform(c, (&lt;span style=&quot;color: #228b22;&quot;&gt;Translation&lt;/span&gt;) t);
        &lt;span style=&quot;color: #a020f0;&quot;&gt;else&lt;/span&gt; &lt;span style=&quot;color: #a020f0;&quot;&gt;if&lt;/span&gt; (t &lt;span style=&quot;color: #a020f0;&quot;&gt;instanceof&lt;/span&gt; VFlip) &lt;span style=&quot;color: #a020f0;&quot;&gt;return&lt;/span&gt; transform(c, (&lt;span style=&quot;color: #228b22;&quot;&gt;VFlip&lt;/span&gt;) t);
        &lt;span style=&quot;color: #a020f0;&quot;&gt;else&lt;/span&gt; &lt;span style=&quot;color: #a020f0;&quot;&gt;throw&lt;/span&gt; &lt;span style=&quot;color: #a020f0;&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color: #228b22;&quot;&gt;RuntimeException&lt;/span&gt;(&lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;not implemented&quot;&lt;/span&gt;);
}
&lt;/pre&gt;

Как только количество типов, которые надо обработать, увеличится, а их дерево наследования вырастет, этот метод превратится в спагетти.

Тем временем multiple dispatch присутствует, например, в объектной системе для Common Lisp — CLOS. Таким образом, код на Common Lisp мог бы быть следующим. 

    &lt;pre&gt;
(&lt;span style=&quot;color: #a020f0;&quot;&gt;defclass&lt;/span&gt; &lt;span style=&quot;color: #228b22;&quot;&gt;translation&lt;/span&gt; () (x &lt;span style=&quot;color: #da70d6;&quot;&gt;:initarg&lt;/span&gt; &lt;span style=&quot;color: #da70d6;&quot;&gt;:x&lt;/span&gt; y &lt;span style=&quot;color: #da70d6;&quot;&gt;:initarg&lt;/span&gt; &lt;span style=&quot;color: #da70d6;&quot;&gt;:y&lt;/span&gt;))
(&lt;span style=&quot;color: #a020f0;&quot;&gt;defclass&lt;/span&gt; &lt;span style=&quot;color: #228b22;&quot;&gt;vflip&lt;/span&gt; () (y &lt;span style=&quot;color: #da70d6;&quot;&gt;:initarg&lt;/span&gt; &lt;span style=&quot;color: #da70d6;&quot;&gt;:y&lt;/span&gt;))
(&lt;span style=&quot;color: #a020f0;&quot;&gt;defclass&lt;/span&gt; &lt;span style=&quot;color: #228b22;&quot;&gt;circle&lt;/span&gt; () (x &lt;span style=&quot;color: #da70d6;&quot;&gt;:initarg&lt;/span&gt; &lt;span style=&quot;color: #da70d6;&quot;&gt;:x&lt;/span&gt; y &lt;span style=&quot;color: #da70d6;&quot;&gt;:initarg&lt;/span&gt; &lt;span style=&quot;color: #da70d6;&quot;&gt;:y&lt;/span&gt; r &lt;span style=&quot;color: #da70d6;&quot;&gt;:initarg&lt;/span&gt; &lt;span style=&quot;color: #da70d6;&quot;&gt;:r&lt;/span&gt;))
(&lt;span style=&quot;color: #a020f0;&quot;&gt;defmethod&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;transform&lt;/span&gt; ((c circle) (tr translation))
  (make-instance &apos;circle &lt;span style=&quot;color: #da70d6;&quot;&gt;:x&lt;/span&gt; (+ (slot-value c &apos;x) (slot-value tr &apos;x))
                        &lt;span style=&quot;color: #da70d6;&quot;&gt;:y&lt;/span&gt; (+ (slot-value c &apos;y) (slot-value tr &apos;y))
                        &lt;span style=&quot;color: #da70d6;&quot;&gt;:r&lt;/span&gt; (slot-value c &apos;r)))
(&lt;span style=&quot;color: #a020f0;&quot;&gt;defmethod&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;transform&lt;/span&gt; ((c circle) (f vflip))
  (make-instance &apos;circle &lt;span style=&quot;color: #da70d6;&quot;&gt;:x&lt;/span&gt; (slot-value c &apos;x)
                         &lt;span style=&quot;color: #da70d6;&quot;&gt;:y&lt;/span&gt; (- (* 2 (slot-value f &apos;y)) (slot-value c &apos;y))
                         &lt;span style=&quot;color: #da70d6;&quot;&gt;:r&lt;/span&gt; (slot-value c &apos;r)))
(&lt;span style=&quot;color: #a020f0;&quot;&gt;defmethod&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;transform&lt;/span&gt; ((c circle) (tlist sequence))
  (reduce #&apos;transform tlist &lt;span style=&quot;color: #da70d6;&quot;&gt;:initial-value&lt;/span&gt; c))
&lt;/pre&gt;

Даже если мы вдруг заведем подкласс &lt;span style=&quot;color: #228b22;&quot;&gt;translation&lt;/span&gt; (назовем его &lt;span style=&quot;color: #228b22;&quot;&gt;subtranslation&lt;/span&gt;), не определив для него функцию &lt;span style=&quot;color: #0000ff;&quot;&gt;transform&lt;/span&gt;, то при ее применении к объекту типа &lt;span style=&quot;color: #228b22;&quot;&gt;subtranslation&lt;/span&gt; будет вызван вариант для типа &lt;span style=&quot;color: #228b22;&quot;&gt;translation&lt;/span&gt;. 

На самом деле стоит заметить, что пока во всех примерах нем необходим только &lt;em&gt;single dispatch&lt;/em&gt;, так как реально мы специализируем функцию по типу только одного аргумента. И вот single dispatch уже присутствует в Java и вообще большинстве ОО-языков — это переопределение методов в подклассе. Действительно, стоит просто представить себе метод класса, как функцию, принимающую дополнительным параметром объект этого класса (что явно сделано в python, CLOS и &lt;a href=&quot;http://library.gnome.org/devel/gobject/unstable/&quot;&gt;GObject&lt;/a&gt; — причем везде по разным причинам). Итак, имея в руках single dispatch, мы можем проделать следующий трюк, знакомый нам по &lt;a href=&quot;http://en.wikipedia.org/wiki/Visitor_pattern&quot;&gt;visitor pattern&lt;/a&gt;. 

    &lt;pre&gt;
&lt;span style=&quot;color: #a020f0;&quot;&gt;interface&lt;/span&gt; &lt;span style=&quot;color: #228b22;&quot;&gt;Transform&lt;/span&gt; {
        &lt;span style=&quot;color: #228b22;&quot;&gt;Circle&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;apply&lt;/span&gt;(&lt;span style=&quot;color: #228b22;&quot;&gt;Circle&lt;/span&gt;);
}

&lt;span style=&quot;color: #a020f0;&quot;&gt;class&lt;/span&gt; &lt;span style=&quot;color: #228b22;&quot;&gt;Translation&lt;/span&gt; &lt;span style=&quot;color: #a020f0;&quot;&gt;implements&lt;/span&gt; &lt;span style=&quot;color: #228b22;&quot;&gt;Transform&lt;/span&gt; {
        &lt;span style=&quot;color: #b22222;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #b22222;&quot;&gt;...
&lt;/span&gt;        &lt;span style=&quot;color: #228b22;&quot;&gt;Circle&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;apply&lt;/span&gt;(&lt;span style=&quot;color: #228b22;&quot;&gt;Circle&lt;/span&gt; &lt;span style=&quot;color: #b8860b;&quot;&gt;c&lt;/span&gt;) {
                &lt;span style=&quot;color: #a020f0;&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;color: #a020f0;&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color: #228b22;&quot;&gt;Circle&lt;/span&gt;(c.x + x, c.y + y, c.r);
        }
}

&lt;span style=&quot;color: #a020f0;&quot;&gt;class&lt;/span&gt; &lt;span style=&quot;color: #228b22;&quot;&gt;VFlip&lt;/span&gt; &lt;span style=&quot;color: #a020f0;&quot;&gt;implements&lt;/span&gt; &lt;span style=&quot;color: #228b22;&quot;&gt;Transform&lt;/span&gt; {
        &lt;span style=&quot;color: #b22222;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #b22222;&quot;&gt;...
&lt;/span&gt;        &lt;span style=&quot;color: #228b22;&quot;&gt;Circle&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;apply&lt;/span&gt;(&lt;span style=&quot;color: #228b22;&quot;&gt;Circle&lt;/span&gt; &lt;span style=&quot;color: #b8860b;&quot;&gt;c&lt;/span&gt;) {
                &lt;span style=&quot;color: #a020f0;&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;color: #a020f0;&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color: #228b22;&quot;&gt;Circle&lt;/span&gt;(c.x, 2*y - c.y, c.r);
        }
}

&lt;span style=&quot;color: #a020f0;&quot;&gt;class&lt;/span&gt; &lt;span style=&quot;color: #228b22;&quot;&gt;Program&lt;/span&gt; {
        &lt;span style=&quot;color: #228b22;&quot;&gt;Circle&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;transform&lt;/span&gt;(&lt;span style=&quot;color: #228b22;&quot;&gt;Circle&lt;/span&gt; &lt;span style=&quot;color: #b8860b;&quot;&gt;c&lt;/span&gt;, Iterable&amp;lt;Transform&amp;gt; transforms) {
                &lt;span style=&quot;color: #228b22;&quot;&gt;Circle&lt;/span&gt; &lt;span style=&quot;color: #b8860b;&quot;&gt;result&lt;/span&gt; = c;
                &lt;span style=&quot;color: #a020f0;&quot;&gt;for&lt;/span&gt; (Transform t: transforms) result = t.apply(result);
                &lt;span style=&quot;color: #a020f0;&quot;&gt;return&lt;/span&gt; result;
        }
}
&lt;/pre&gt;

Сразу можно сделать два замечания к дизайну: во-первых, &lt;span style=&quot;color: #228b22;&quot;&gt;VFlip&lt;/span&gt; и &lt;span style=&quot;color: #228b22;&quot;&gt;Translation&lt;/span&gt; &lt;em&gt;зависят&lt;/em&gt; от &lt;span style=&quot;color: #228b22;&quot;&gt;Circle&lt;/span&gt;, и эта зависимость явно лишняя; во-вторых, нет разделения алгоритма и типа данных, но это — меньшая проблема, да и вообще она присутствует почти в любом ОО-дизайне. Даже если закрыть на это глаза, у single dispatch все равно есть потолок — нам моментально станет его недостаточно, как только мы введем абстрактный тип &lt;em&gt;фигура&lt;/em&gt; и не только сделаем &lt;em&gt;окружность&lt;/em&gt; его подтипом, но и добавим еще один — скажем, &lt;em&gt;треугольник&lt;/em&gt;.

Однако то, что в Java нет multiple dispatch еще не значит, что мы его не можем написать сами. В голову сразу приходят два варианта — вручную хранить список методов, индексируя по типу агрументов или использовать обычные методы, но вызывать их рефлективно. Если пойти первым путем, то может получиться следующее.

    &lt;pre&gt;
&lt;span style=&quot;color: #a020f0;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #a020f0;&quot;&gt;interface&lt;/span&gt; &lt;span style=&quot;color: #228b22;&quot;&gt;Function&lt;/span&gt;&amp;lt;X, &lt;span style=&quot;color: #228b22;&quot;&gt;Y&lt;/span&gt;&amp;gt; {
        &lt;span style=&quot;color: #a020f0;&quot;&gt;public&lt;/span&gt;&amp;lt;V &lt;span style=&quot;color: #a020f0;&quot;&gt;extends&lt;/span&gt; &lt;span style=&quot;color: #228b22;&quot;&gt;X&lt;/span&gt;&amp;gt; Y apply(&lt;span style=&quot;color: #228b22;&quot;&gt;V&lt;/span&gt; &lt;span style=&quot;color: #b8860b;&quot;&gt;x&lt;/span&gt;);
}

&lt;span style=&quot;color: #a020f0;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #a020f0;&quot;&gt;class&lt;/span&gt; &lt;span style=&quot;color: #228b22;&quot;&gt;MultiMethod&lt;/span&gt;&amp;lt;X, &lt;span style=&quot;color: #228b22;&quot;&gt;Y&lt;/span&gt;&amp;gt; &lt;span style=&quot;color: #a020f0;&quot;&gt;implements&lt;/span&gt; &lt;span style=&quot;color: #228b22;&quot;&gt;Function&lt;/span&gt;&amp;lt;X, &lt;span style=&quot;color: #228b22;&quot;&gt;Y&lt;/span&gt;&amp;gt; {
        &lt;span style=&quot;color: #a020f0;&quot;&gt;private&lt;/span&gt; &lt;span style=&quot;color: #a020f0;&quot;&gt;final&lt;/span&gt; &lt;span style=&quot;color: #228b22;&quot;&gt;Map&lt;/span&gt;&amp;lt;Class, Function&amp;lt;? &lt;span style=&quot;color: #a020f0;&quot;&gt;extends&lt;/span&gt; &lt;span style=&quot;color: #228b22;&quot;&gt;X&lt;/span&gt;, &lt;span style=&quot;color: #228b22;&quot;&gt;Y&lt;/span&gt;&amp;gt;&amp;gt; methods = &lt;span style=&quot;color: #a020f0;&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color: #228b22;&quot;&gt;HashMap&lt;/span&gt;&amp;lt;Class, Function&amp;lt;? &lt;span style=&quot;color: #a020f0;&quot;&gt;extends&lt;/span&gt; &lt;span style=&quot;color: #228b22;&quot;&gt;X&lt;/span&gt;,&lt;span style=&quot;color: #228b22;&quot;&gt;Y&lt;/span&gt;&amp;gt;&amp;gt;();
        &lt;span style=&quot;color: #a020f0;&quot;&gt;public&lt;/span&gt; &amp;lt;V &lt;span style=&quot;color: #a020f0;&quot;&gt;extends&lt;/span&gt; &lt;span style=&quot;color: #228b22;&quot;&gt;X&lt;/span&gt;&amp;gt; Y apply(&lt;span style=&quot;color: #228b22;&quot;&gt;V&lt;/span&gt; &lt;span style=&quot;color: #b8860b;&quot;&gt;x&lt;/span&gt;) {
                &lt;span style=&quot;color: #228b22;&quot;&gt;Class&lt;/span&gt; &lt;span style=&quot;color: #b8860b;&quot;&gt;argclass&lt;/span&gt; = x.getClass();
                &lt;span style=&quot;color: #a020f0;&quot;&gt;do&lt;/span&gt; {
                        Function&amp;lt;? &lt;span style=&quot;color: #a020f0;&quot;&gt;extends&lt;/span&gt; &lt;span style=&quot;color: #228b22;&quot;&gt;X&lt;/span&gt;, &lt;span style=&quot;color: #228b22;&quot;&gt;Y&lt;/span&gt;&amp;gt; f = methods.get(argclass);
                        &lt;span style=&quot;color: #a020f0;&quot;&gt;if&lt;/span&gt; (f != &lt;span style=&quot;color: #5f9ea0;&quot;&gt;null&lt;/span&gt;) &lt;span style=&quot;color: #a020f0;&quot;&gt;return&lt;/span&gt; ((Function&amp;lt;V, Y&amp;gt;) f).apply(x);
                        &lt;span style=&quot;color: #a020f0;&quot;&gt;else&lt;/span&gt; argclass = argclass.getSuperclass();
                } &lt;span style=&quot;color: #a020f0;&quot;&gt;while&lt;/span&gt; (argclass != Object.&lt;span style=&quot;color: #a020f0;&quot;&gt;class&lt;/span&gt;);
                &lt;span style=&quot;color: #a020f0;&quot;&gt;throw&lt;/span&gt; &lt;span style=&quot;color: #a020f0;&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color: #228b22;&quot;&gt;RuntimeException&lt;/span&gt;(&lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;not implemented&quot;&lt;/span&gt;);
        }       
        &lt;span style=&quot;color: #a020f0;&quot;&gt;public&lt;/span&gt; &amp;lt;V &lt;span style=&quot;color: #a020f0;&quot;&gt;extends&lt;/span&gt; &lt;span style=&quot;color: #228b22;&quot;&gt;X&lt;/span&gt;&amp;gt; &lt;span style=&quot;color: #228b22;&quot;&gt;void&lt;/span&gt; implement(Class&amp;lt;V&amp;gt; c, Function&amp;lt;V, Y&amp;gt; method) {
                methods.put(c, method);
        }
}
&lt;/pre&gt;

Это — только пример double dispatch, к тому же мы полагаем, что аргумент не может быть &lt;span style=&quot;color: #5f9ea0;&quot;&gt;null&lt;/span&gt;&amp;lt;/pre&amp;gt;. 
Но тем не менее код рабочий — вот пример.

    &lt;pre&gt;
&lt;span style=&quot;color: #a020f0;&quot;&gt;class&lt;/span&gt; &lt;span style=&quot;color: #228b22;&quot;&gt;Test&lt;/span&gt; {
        &lt;span style=&quot;color: #a020f0;&quot;&gt;static&lt;/span&gt; &lt;span style=&quot;color: #a020f0;&quot;&gt;interface&lt;/span&gt; &lt;span style=&quot;color: #228b22;&quot;&gt;A&lt;/span&gt; {};
        &lt;span style=&quot;color: #a020f0;&quot;&gt;static&lt;/span&gt; &lt;span style=&quot;color: #a020f0;&quot;&gt;class&lt;/span&gt; &lt;span style=&quot;color: #228b22;&quot;&gt;B&lt;/span&gt; &lt;span style=&quot;color: #a020f0;&quot;&gt;implements&lt;/span&gt; &lt;span style=&quot;color: #228b22;&quot;&gt;A&lt;/span&gt; {};
        &lt;span style=&quot;color: #a020f0;&quot;&gt;static&lt;/span&gt; &lt;span style=&quot;color: #a020f0;&quot;&gt;class&lt;/span&gt; &lt;span style=&quot;color: #228b22;&quot;&gt;C&lt;/span&gt; &lt;span style=&quot;color: #a020f0;&quot;&gt;implements&lt;/span&gt; &lt;span style=&quot;color: #228b22;&quot;&gt;A&lt;/span&gt; {};
        &lt;span style=&quot;color: #a020f0;&quot;&gt;final&lt;/span&gt; &lt;span style=&quot;color: #228b22;&quot;&gt;Function&lt;/span&gt;&amp;lt;A, String&amp;gt; test;
        &lt;span style=&quot;color: #a020f0;&quot;&gt;protected&lt;/span&gt; &lt;span style=&quot;color: #a020f0;&quot;&gt;final&lt;/span&gt; &lt;span style=&quot;color: #228b22;&quot;&gt;MultiMethod&lt;/span&gt;&amp;lt;A, String&amp;gt; mm = &lt;span style=&quot;color: #a020f0;&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color: #228b22;&quot;&gt;MultiMethod&lt;/span&gt;&amp;lt;A, String&amp;gt;();
        &lt;span style=&quot;color: #a020f0;&quot;&gt;public&lt;/span&gt; Test() {
                mm.implement(A.&lt;span style=&quot;color: #a020f0;&quot;&gt;class&lt;/span&gt;, &lt;span style=&quot;color: #a020f0;&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color: #228b22;&quot;&gt;Function&lt;/span&gt;&amp;lt;A, String&amp;gt;() {
                        &lt;span style=&quot;color: #a020f0;&quot;&gt;public&lt;/span&gt; &amp;lt;V &lt;span style=&quot;color: #a020f0;&quot;&gt;extends&lt;/span&gt; &lt;span style=&quot;color: #228b22;&quot;&gt;A&lt;/span&gt;&amp;gt; String apply(&lt;span style=&quot;color: #228b22;&quot;&gt;V&lt;/span&gt; &lt;span style=&quot;color: #b8860b;&quot;&gt;x&lt;/span&gt;) {
                                &lt;span style=&quot;color: #a020f0;&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;this is A&quot;&lt;/span&gt;;
                        }
                });
                mm.implement(B.&lt;span style=&quot;color: #a020f0;&quot;&gt;class&lt;/span&gt;, &lt;span style=&quot;color: #a020f0;&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color: #228b22;&quot;&gt;Function&lt;/span&gt;&amp;lt;B, String&amp;gt;() {
                        &lt;span style=&quot;color: #a020f0;&quot;&gt;public&lt;/span&gt; &amp;lt;V &lt;span style=&quot;color: #a020f0;&quot;&gt;extends&lt;/span&gt; &lt;span style=&quot;color: #228b22;&quot;&gt;B&lt;/span&gt;&amp;gt; String apply(&lt;span style=&quot;color: #228b22;&quot;&gt;V&lt;/span&gt; &lt;span style=&quot;color: #b8860b;&quot;&gt;x&lt;/span&gt;) {
                                &lt;span style=&quot;color: #a020f0;&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;this is B&quot;&lt;/span&gt;;
                        }
                });
                test = mm;
        }
        &lt;span style=&quot;color: #a020f0;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #a020f0;&quot;&gt;static&lt;/span&gt; &lt;span style=&quot;color: #228b22;&quot;&gt;void&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;main&lt;/span&gt;(&lt;span style=&quot;color: #228b22;&quot;&gt;String&lt;/span&gt;[] &lt;span style=&quot;color: #b8860b;&quot;&gt;args&lt;/span&gt;) {
                &lt;span style=&quot;color: #228b22;&quot;&gt;Test&lt;/span&gt; &lt;span style=&quot;color: #b8860b;&quot;&gt;t&lt;/span&gt; = &lt;span style=&quot;color: #a020f0;&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color: #228b22;&quot;&gt;Test&lt;/span&gt;();
                System.out.println(t.test.apply(&lt;span style=&quot;color: #a020f0;&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color: #228b22;&quot;&gt;B&lt;/span&gt;()));
                System.out.println(t.test.apply(&lt;span style=&quot;color: #a020f0;&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color: #228b22;&quot;&gt;C&lt;/span&gt;()));
        }
}
&lt;/pre&gt;

Здесь возможно переопределение мультиметода при наследовании — просто путем вызова &lt;span style=&quot;color: #0000ff;&quot;&gt;implement&lt;/span&gt;. 
Но все же получилось громоздко в первую очередь потому что в Java нет функций как значений ни в каком виде, а анонимные классы-обертки создают синтаксический мусор. Эту (недо)реализацию мультиметодов легко портировать на Scala, где они будут смотреться более элегантно, хотя байткод при компиляции будет идентичным.

    &lt;pre&gt;
&lt;span style=&quot;color: #a020f0;&quot;&gt;import&lt;/span&gt; scala.collection.mutable.HashMap

&lt;span style=&quot;color: #a020f0;&quot;&gt;class&lt;/span&gt; &lt;span style=&quot;color: #228b22;&quot;&gt;MultiMethod&lt;/span&gt;[&lt;span style=&quot;color: #228b22;&quot;&gt;X &amp;lt;: Object&lt;/span&gt;, &lt;span style=&quot;color: #228b22;&quot;&gt;Y&lt;/span&gt;] &lt;span style=&quot;color: #a020f0;&quot;&gt;extends&lt;/span&gt; (X =&amp;gt; Y) {
        &lt;span style=&quot;color: #a020f0;&quot;&gt;private&lt;/span&gt; &lt;span style=&quot;color: #a020f0;&quot;&gt;val&lt;/span&gt; &lt;span style=&quot;color: #b8860b;&quot;&gt;methods&lt;/span&gt; = &lt;span style=&quot;color: #a020f0;&quot;&gt;new&lt;/span&gt; HashMap[Class[_], (_ &amp;lt;: X) =&amp;gt; Y]()
        &lt;span style=&quot;color: #a020f0;&quot;&gt;def&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;apply&lt;/span&gt;(&lt;span style=&quot;color: #b8860b;&quot;&gt;x&lt;/span&gt;: &lt;span style=&quot;color: #228b22;&quot;&gt;X&lt;/span&gt;): &lt;span style=&quot;color: #228b22;&quot;&gt;Y &lt;/span&gt;= {
                &lt;span style=&quot;color: #a020f0;&quot;&gt;var&lt;/span&gt; &lt;span style=&quot;color: #b8860b;&quot;&gt;argclass&lt;/span&gt; = x.getClass()
                &lt;span style=&quot;color: #a020f0;&quot;&gt;do&lt;/span&gt; {
                        methods.get(argclass) &lt;span style=&quot;color: #a020f0;&quot;&gt;match&lt;/span&gt; {
                            &lt;span style=&quot;color: #a020f0;&quot;&gt;case&lt;/span&gt; &lt;span style=&quot;color: #228b22;&quot;&gt;Some&lt;/span&gt;(&lt;span style=&quot;color: #b8860b;&quot;&gt;f&lt;/span&gt;) =&amp;gt; &lt;span style=&quot;color: #a020f0;&quot;&gt;return&lt;/span&gt; f.asInstanceOf[X =&amp;gt; Y](x)
                            &lt;span style=&quot;color: #a020f0;&quot;&gt;case&lt;/span&gt; &lt;span style=&quot;color: #228b22;&quot;&gt;None&lt;/span&gt; =&amp;gt; argclass = argclass.getSuperclass()
                        }
                } &lt;span style=&quot;color: #a020f0;&quot;&gt;while&lt;/span&gt; (argclass != classOf[Object])
                &lt;span style=&quot;color: #a020f0;&quot;&gt;throw&lt;/span&gt; &lt;span style=&quot;color: #a020f0;&quot;&gt;new&lt;/span&gt; RuntimeException(&lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;not implemented&quot;&lt;/span&gt;)
        }       
        &lt;span style=&quot;color: #a020f0;&quot;&gt;def&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;implement&lt;/span&gt;[&lt;span style=&quot;color: #228b22;&quot;&gt;V &amp;lt;: X&lt;/span&gt;](&lt;span style=&quot;color: #b8860b;&quot;&gt;c&lt;/span&gt;: &lt;span style=&quot;color: #228b22;&quot;&gt;Class[V]&lt;/span&gt;, &lt;span style=&quot;color: #b8860b;&quot;&gt;method&lt;/span&gt;: &lt;span style=&quot;color: #228b22;&quot;&gt;V =&amp;gt; Y&lt;/span&gt;) = methods.update(c, method)
}

&lt;span style=&quot;color: #a020f0;&quot;&gt;class&lt;/span&gt; &lt;span style=&quot;color: #228b22;&quot;&gt;A&lt;/span&gt;
&lt;span style=&quot;color: #a020f0;&quot;&gt;class&lt;/span&gt; &lt;span style=&quot;color: #228b22;&quot;&gt;B&lt;/span&gt; &lt;span style=&quot;color: #a020f0;&quot;&gt;extends&lt;/span&gt; &lt;span style=&quot;color: #228b22;&quot;&gt;A&lt;/span&gt;
&lt;span style=&quot;color: #a020f0;&quot;&gt;class&lt;/span&gt; &lt;span style=&quot;color: #228b22;&quot;&gt;C&lt;/span&gt; &lt;span style=&quot;color: #a020f0;&quot;&gt;extends&lt;/span&gt; &lt;span style=&quot;color: #228b22;&quot;&gt;A&lt;/span&gt;

&lt;span style=&quot;color: #a020f0;&quot;&gt;class&lt;/span&gt; &lt;span style=&quot;color: #228b22;&quot;&gt;Test&lt;/span&gt; {
        &lt;span style=&quot;color: #a020f0;&quot;&gt;protected&lt;/span&gt; &lt;span style=&quot;color: #a020f0;&quot;&gt;val&lt;/span&gt; &lt;span style=&quot;color: #b8860b;&quot;&gt;mm&lt;/span&gt; = &lt;span style=&quot;color: #a020f0;&quot;&gt;new&lt;/span&gt; MultiMethod[A, String]()
        mm.implement(classOf[A], (a: A) =&amp;gt; &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;this is A&quot;&lt;/span&gt;)
        mm.implement(classOf[B], (b: B) =&amp;gt; &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;this is B&quot;&lt;/span&gt;)
        &lt;span style=&quot;color: #a020f0;&quot;&gt;val&lt;/span&gt; &lt;span style=&quot;color: #b8860b;&quot;&gt;test&lt;/span&gt; = mm
}

&lt;span style=&quot;color: #a020f0;&quot;&gt;object&lt;/span&gt; &lt;span style=&quot;color: #b8860b;&quot;&gt;Main&lt;/span&gt; {
        &lt;span style=&quot;color: #a020f0;&quot;&gt;def&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;main&lt;/span&gt;(&lt;span style=&quot;color: #b8860b;&quot;&gt;args&lt;/span&gt;: &lt;span style=&quot;color: #228b22;&quot;&gt;Array[String]&lt;/span&gt;) {
                &lt;span style=&quot;color: #a020f0;&quot;&gt;val&lt;/span&gt; &lt;span style=&quot;color: #b8860b;&quot;&gt;t&lt;/span&gt; = &lt;span style=&quot;color: #a020f0;&quot;&gt;new&lt;/span&gt; Test()
                println(t.test(&lt;span style=&quot;color: #a020f0;&quot;&gt;new&lt;/span&gt; A()))
                println(t.test(&lt;span style=&quot;color: #a020f0;&quot;&gt;new&lt;/span&gt; B()))
                println(t.test(&lt;span style=&quot;color: #a020f0;&quot;&gt;new&lt;/span&gt; C()))
        }
}
&lt;/pre&gt;
&lt;p&gt;
Даже &lt;em&gt;синтаксис&lt;/em&gt; для вызова мультиметода становится таким же, как и для обычного метода.
&lt;/p&gt;
Если же мы выберем рефлективный путь, то сможем и вовсе обойтись одним методом.

    &lt;pre&gt;
&lt;span style=&quot;color: #a020f0;&quot;&gt;static&lt;/span&gt; &lt;span style=&quot;color: #228b22;&quot;&gt;Object&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;dispatch&lt;/span&gt;(&lt;span style=&quot;color: #228b22;&quot;&gt;Object&lt;/span&gt; &lt;span style=&quot;color: #b8860b;&quot;&gt;target&lt;/span&gt;, &lt;span style=&quot;color: #228b22;&quot;&gt;String&lt;/span&gt; &lt;span style=&quot;color: #b8860b;&quot;&gt;method&lt;/span&gt;, &lt;span style=&quot;color: #228b22;&quot;&gt;Object&lt;/span&gt; &lt;span style=&quot;color: #b8860b;&quot;&gt;arg&lt;/span&gt;) &lt;span style=&quot;color: #a020f0;&quot;&gt;throws&lt;/span&gt; &lt;span style=&quot;color: #228b22;&quot;&gt;InvocationTargetException&lt;/span&gt;, &lt;span style=&quot;color: #228b22;&quot;&gt;SecurityException&lt;/span&gt; {
        Class&amp;lt;?&amp;gt; argclass = arg.getClass();
        &lt;span style=&quot;color: #a020f0;&quot;&gt;do&lt;/span&gt; {
                &lt;span style=&quot;color: #a020f0;&quot;&gt;try&lt;/span&gt; {
                        &lt;span style=&quot;color: #228b22;&quot;&gt;Method&lt;/span&gt; &lt;span style=&quot;color: #b8860b;&quot;&gt;m&lt;/span&gt; = target.getClass().getMethod(method, argclass);
                        &lt;span style=&quot;color: #a020f0;&quot;&gt;return&lt;/span&gt; m.invoke(target, arg);
                } &lt;span style=&quot;color: #a020f0;&quot;&gt;catch&lt;/span&gt; (&lt;span style=&quot;color: #228b22;&quot;&gt;NoSuchMethodException&lt;/span&gt; &lt;span style=&quot;color: #b8860b;&quot;&gt;e&lt;/span&gt;) {
                } &lt;span style=&quot;color: #a020f0;&quot;&gt;catch&lt;/span&gt; (&lt;span style=&quot;color: #228b22;&quot;&gt;IllegalAccessException&lt;/span&gt; &lt;span style=&quot;color: #b8860b;&quot;&gt;e&lt;/span&gt;) {                            
                }                       
        } &lt;span style=&quot;color: #a020f0;&quot;&gt;while&lt;/span&gt; (argclass != Object.&lt;span style=&quot;color: #a020f0;&quot;&gt;class&lt;/span&gt;);
        &lt;span style=&quot;color: #a020f0;&quot;&gt;throw&lt;/span&gt; &lt;span style=&quot;color: #a020f0;&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color: #228b22;&quot;&gt;RuntimeException&lt;/span&gt;(&lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;not implemented&quot;&lt;/span&gt;);
}
&lt;/pre&gt;

Конечно же, мы теряем преимущества статической типизации и проигрываем в производительности, да и куча исключений делает вызывающий код неуклюжим. Хотя использовать выходит достаточно просто.

    &lt;pre&gt;
&lt;span style=&quot;color: #a020f0;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #a020f0;&quot;&gt;class&lt;/span&gt; &lt;span style=&quot;color: #228b22;&quot;&gt;MultipleDispatch&lt;/span&gt; {
        &lt;span style=&quot;color: #a020f0;&quot;&gt;static&lt;/span&gt; &lt;span style=&quot;color: #a020f0;&quot;&gt;interface&lt;/span&gt; &lt;span style=&quot;color: #228b22;&quot;&gt;A&lt;/span&gt; {};
        &lt;span style=&quot;color: #a020f0;&quot;&gt;static&lt;/span&gt; &lt;span style=&quot;color: #a020f0;&quot;&gt;class&lt;/span&gt; &lt;span style=&quot;color: #228b22;&quot;&gt;B&lt;/span&gt; &lt;span style=&quot;color: #a020f0;&quot;&gt;implements&lt;/span&gt; &lt;span style=&quot;color: #228b22;&quot;&gt;A&lt;/span&gt; {};
        &lt;span style=&quot;color: #a020f0;&quot;&gt;static&lt;/span&gt; &lt;span style=&quot;color: #a020f0;&quot;&gt;class&lt;/span&gt; &lt;span style=&quot;color: #228b22;&quot;&gt;C&lt;/span&gt; &lt;span style=&quot;color: #a020f0;&quot;&gt;implements&lt;/span&gt; &lt;span style=&quot;color: #228b22;&quot;&gt;A&lt;/span&gt; {};
        &lt;span style=&quot;color: #a020f0;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #228b22;&quot;&gt;String&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;test&lt;/span&gt;(&lt;span style=&quot;color: #228b22;&quot;&gt;A&lt;/span&gt; &lt;span style=&quot;color: #b8860b;&quot;&gt;a&lt;/span&gt;) {
                &lt;span style=&quot;color: #a020f0;&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;this is A&quot;&lt;/span&gt;;
        }
        &lt;span style=&quot;color: #a020f0;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #228b22;&quot;&gt;String&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;test&lt;/span&gt;(&lt;span style=&quot;color: #228b22;&quot;&gt;B&lt;/span&gt; &lt;span style=&quot;color: #b8860b;&quot;&gt;b&lt;/span&gt;) {
                &lt;span style=&quot;color: #a020f0;&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;this is B&quot;&lt;/span&gt;;
        }
        &lt;span style=&quot;color: #a020f0;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #a020f0;&quot;&gt;static&lt;/span&gt; &lt;span style=&quot;color: #228b22;&quot;&gt;void&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;main&lt;/span&gt;(&lt;span style=&quot;color: #228b22;&quot;&gt;String&lt;/span&gt;[] &lt;span style=&quot;color: #b8860b;&quot;&gt;args&lt;/span&gt;) {
                &lt;span style=&quot;color: #228b22;&quot;&gt;Object&lt;/span&gt; &lt;span style=&quot;color: #b8860b;&quot;&gt;target&lt;/span&gt; = &lt;span style=&quot;color: #a020f0;&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color: #228b22;&quot;&gt;MultipleDispatch&lt;/span&gt;();
                &lt;span style=&quot;color: #228b22;&quot;&gt;String&lt;/span&gt; &lt;span style=&quot;color: #b8860b;&quot;&gt;method&lt;/span&gt; = &lt;span style=&quot;color: #bc8f8f;&quot;&gt;&quot;test&quot;&lt;/span&gt;;
                &lt;span style=&quot;color: #a020f0;&quot;&gt;try&lt;/span&gt; {
                        System.out.println(dispatch(target, method, &lt;span style=&quot;color: #a020f0;&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color: #228b22;&quot;&gt;B&lt;/span&gt;()));
                        System.out.println(dispatch(target, method, &lt;span style=&quot;color: #a020f0;&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color: #228b22;&quot;&gt;C&lt;/span&gt;()));
                } &lt;span style=&quot;color: #a020f0;&quot;&gt;catch&lt;/span&gt; (&lt;span style=&quot;color: #228b22;&quot;&gt;Exception&lt;/span&gt; &lt;span style=&quot;color: #b8860b;&quot;&gt;e&lt;/span&gt;) {};
        }
}&lt;/pre&gt;

&lt;p&gt;
Естественно, несколько вариантов мультиметода могут подходить для применения к аргументам с данными типами. Конкретный метод, который будет применен, определяется правилами данной системы multiple dispatch — это может быть метод с «ближайшей» в лексикографическом смысле подписью, а, скажем, в CLOS можно эти правила менять. Так вот, так же как при переопределении методов в Java можно вызвать &lt;em&gt;следующий&lt;/em&gt; подходящий метод в single dispatch через  &lt;span style=&quot;color: #a020f0;&quot;&gt;super&lt;/span&gt;, в CLOS можно вызвать следующий метод посредством &lt;span style=&quot;color: #a020f0;&quot;&gt;call-next-method&lt;/span&gt;. Добавление его эквивалента в приемлемом виде в любую из реализаций выше, похоже, нетривиально.
&lt;/p&gt;
&lt;p&gt;
И вообще обобщение double dispatch до произвольного multiple dispatch будет достаточно комплексным, особенно для оптимизации. Но по сути единственная оптимизация, которую мы можем сделать в коде — это выбрать хороший алгоритм для поиска метода по типам. Возможности же компилятора и VM для оптимизации multiple dispatch теоретически гораздо шире. Поэтому есть как минимум два расширения компилятора Java, поддерживающие multiple dispatch: &lt;a href=&quot;http://multijava.sourceforge.net/&quot;&gt;MultiJava&lt;/a&gt; и &lt;a href=&quot;https://pec.dev.java.net/&quot;&gt;PEC&lt;/a&gt; (последний, кстати, и без этого достаточно интересный проект).
&lt;/p&gt;
&lt;p&gt;
Что же с другими языками? Единственный мне знакомый язык с multiple dispatch, кроме Common Lisp, — это Groovy. В нем каждый метод по умолчанию его поддерживает. Еще я слышал, что multiple dispatch есть в Nice, но это, собственно, единственное, что я знаю о Nice. В динамических языках же как правило мультиметоды легко реализовать, потому что есть нормальные средства для интроспекции. Чем шире возможности метапрограммирования такого языка, тем более элегантно реализация впишется в код. Например, Guido давал &lt;a href=&quot;http://www.artima.com/weblogs/viewpost.jsp?thread=101605&quot;&gt;пример&lt;/a&gt; очень простой реализации на Python с декораторами, используя которую, наш пример можно описать примерно так.
&lt;/p&gt;

&lt;pre&gt;
&lt;span style=&quot;color: #a020f0;&quot;&gt;class&lt;/span&gt; &lt;span style=&quot;color: #228b22;&quot;&gt;Circle&lt;/span&gt;:
    &lt;span style=&quot;color: #a020f0;&quot;&gt;def&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;__init__&lt;/span&gt;(&lt;span style=&quot;color: #a020f0;&quot;&gt;self&lt;/span&gt;, x, y, r):
        &lt;span style=&quot;color: #a020f0;&quot;&gt;self&lt;/span&gt;.x = x
        &lt;span style=&quot;color: #a020f0;&quot;&gt;self&lt;/span&gt;.y = y
        &lt;span style=&quot;color: #a020f0;&quot;&gt;self&lt;/span&gt;.r = r

&lt;span style=&quot;color: #a020f0;&quot;&gt;class&lt;/span&gt; &lt;span style=&quot;color: #228b22;&quot;&gt;Translation&lt;/span&gt;:
    &lt;span style=&quot;color: #a020f0;&quot;&gt;def&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;__init__&lt;/span&gt;(&lt;span style=&quot;color: #a020f0;&quot;&gt;self&lt;/span&gt;, x, y):
        &lt;span style=&quot;color: #a020f0;&quot;&gt;self&lt;/span&gt;.x = x
        &lt;span style=&quot;color: #a020f0;&quot;&gt;self&lt;/span&gt;.y = y

&lt;span style=&quot;color: #a020f0;&quot;&gt;class&lt;/span&gt; &lt;span style=&quot;color: #228b22;&quot;&gt;VFlip&lt;/span&gt;:
    &lt;span style=&quot;color: #a020f0;&quot;&gt;def&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;__init__&lt;/span&gt;(&lt;span style=&quot;color: #a020f0;&quot;&gt;self&lt;/span&gt;, y):
        &lt;span style=&quot;color: #a020f0;&quot;&gt;self&lt;/span&gt;.y = y

&lt;span style=&quot;color: #228b22;&quot;&gt;@multimethod&lt;/span&gt;(Circle, Translation)
&lt;span style=&quot;color: #a020f0;&quot;&gt;def&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;transform&lt;/span&gt;(c, t):
    &lt;span style=&quot;color: #a020f0;&quot;&gt;return&lt;/span&gt; Circle(c.x + t.x, c.y + t.y, c.r)

&lt;span style=&quot;color: #228b22;&quot;&gt;@multimethod&lt;/span&gt;(Circle, VFlip)
&lt;span style=&quot;color: #a020f0;&quot;&gt;def&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;transform&lt;/span&gt;(c, f):
    &lt;span style=&quot;color: #a020f0;&quot;&gt;return&lt;/span&gt; Circle(c.x, 2*f.y - c.y, c.r)

&lt;span style=&quot;color: #228b22;&quot;&gt;@multimethod&lt;/span&gt;(Circle, &lt;span style=&quot;color: #da70d6;&quot;&gt;list&lt;/span&gt;)
&lt;span style=&quot;color: #a020f0;&quot;&gt;def&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;transform&lt;/span&gt;(c, l):
    &lt;span style=&quot;color: #a020f0;&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;color: #da70d6;&quot;&gt;reduce&lt;/span&gt;(transform, l, c)
&lt;/pre&gt;

Для Ruby есть пара библиотек, реализующих мультиметоды — &lt;a href=&quot;http://rubyforge.org/projects/multi/&quot;&gt;Multiple Dispatch&lt;/a&gt; и &lt;a href=&quot;http://rubyforge.org/projects/multimethod&quot;&gt;Multimethods&lt;/a&gt;. Конечно такой модуль нашелся и для Perl — &lt;a href=&quot;http://search.cpan.org/~dconway/Class-Multimethods/lib/Class/Multimethods.pod&quot;&gt;Class::Multimethods&lt;/a&gt;.

На самом деле язык не обязан быть динамическим, чтобы поддерживать мультиметоды. Все объектно-ориентированные языки имеют single dispatch, и совершенно ничего не ограничивает обобщения до multiple dispatch. Действительно — не так давно Bjarne Stroustrup сотоварищи написал &lt;a href=&quot;http://research.att.com/~bs/multimethods.pdf&quot;&gt;статью&lt;/a&gt; о возможной реализации мультиметодов для C++.
&lt;p&gt;
&lt;span style=&quot;font-size: 85%; font-style: italic&quot;&gt;Upd: добавил для сравнения код на Scala&lt;/span&gt; 
&lt;/p&gt;</description>
  <comments>http://ogolberg.livejournal.com/44025.html</comments>
  <category>scala</category>
  <category>python</category>
  <category>java</category>
  <category>lisp</category>
  <category>metaprogramming</category>
  <category>c++</category>
  <category>oop</category>
  <lj:music>Duke Ellington - Satin Doll</lj:music>
  <media:title type="plain">Duke Ellington - Satin Doll</media:title>
  <lj:mood>disappointed</lj:mood>
  <lj:security>public</lj:security>
  <lj:reply-count>1</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://ogolberg.livejournal.com/43162.html</guid>
  <pubDate>Thu, 29 May 2008 16:57:16 GMT</pubDate>
  <title>Простой и полезный девайс</title>
  <link>http://ogolberg.livejournal.com/43162.html</link>
  <description>&lt;p style=&quot;margin-left: 3em; font-size: 80%; border-left: 1px solid gray; padding: .5em&quot;&gt;Phil: I don&apos;t suppose there&apos;s any chance of an espresso or cappuccino?&lt;br /&gt;
Mrs. Lancaster: &lt;em&gt;(confused look)&lt;/em&gt; Oh, I don&apos;t know...&lt;br /&gt;
Phil: &lt;em&gt;(turns away, to self)&lt;/em&gt; ... how to &lt;em&gt;spell&lt;/em&gt; espresso or cappuccino.&lt;br /&gt;
&lt;span style=&quot;margin-left: 2em&quot;&gt;&amp;mdash;&lt;a href=&quot;http://www.imdb.com/title/tt0107048/&quot;&gt;&lt;cite&gt;Groundhog Day&lt;/cite&gt;&lt;/a&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div style=&quot;float:left; padding: 0 .5em&quot;&gt;
&lt;p style=&quot;text-align: center; font-size: 7pt; border: 1px solid gray&quot;&gt;&lt;a style=&quot;text-decoration:none&quot; href=&quot;http://img46.imageshack.us/img46/1275/mokarq0.jpg&quot;&gt;&lt;img src=&quot;http://img46.imageshack.us/img46/8466/mokathumbro9.jpg&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;http://img46.imageshack.us/img46/1275/mokarq0.jpg&quot;&gt;click to enlarge&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;&lt;br /&gt;Практически случайно оказался обладателем «Moka Express». В нем получается очень неплохой эспрессо, который приятно запивать холодной водой. Главное преимущество перед эспрессо-машиной — это конечно цена, ну и аура несколько другая у «ручного» приготовления. Про турку забыл очень быстро — тут и кофе на мой вкус гораздо лучше, и готовится быстрее, и постоянного наблюдения не требуется.&lt;/p&gt;</description>
  <comments>http://ogolberg.livejournal.com/43162.html</comments>
  <category>кофе</category>
  <lj:music>Duke Ellington - Caravan</lj:music>
  <media:title type="plain">Duke Ellington - Caravan</media:title>
  <lj:mood>accomplished</lj:mood>
  <lj:security>public</lj:security>
  <lj:reply-count>2</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://ogolberg.livejournal.com/42853.html</guid>
  <pubDate>Fri, 16 May 2008 20:43:30 GMT</pubDate>
  <title>Знаете, что такое сюр?</title>
  <link>http://ogolberg.livejournal.com/42853.html</link>
  <description>&lt;img style=&quot;float:left; padding-right: 1em; padding-bottom: .5em;&quot; src=&quot;http://img527.imageshack.us/img527/2359/manuelby5.png&quot; /&gt;
&lt;p&gt;Это когда приходится читать справочник по армянскому на французском, не зная ни того, ни другого.&lt;/p&gt;
&lt;p&gt;А Google Translate вообще убил. Засунуть выбор из всего 23 языков вместо обычного select во вложенные div&apos;ы с прокруткой, в которых естественно не работает выбор с клавиатуры по первым буквам — для этого надо было очень долго думать. Очень.&lt;/p&gt;</description>
  <comments>http://ogolberg.livejournal.com/42853.html</comments>
  <category>college</category>
  <lj:music>Duke Ellington - Tea for Two</lj:music>
  <media:title type="plain">Duke Ellington - Tea for Two</media:title>
  <lj:mood>sleepy</lj:mood>
  <lj:security>public</lj:security>
  <lj:reply-count>4</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://ogolberg.livejournal.com/42276.html</guid>
  <pubDate>Tue, 13 May 2008 05:40:05 GMT</pubDate>
  <title>День Выборов</title>
  <link>http://ogolberg.livejournal.com/42276.html</link>
  <description>Посмотрел тут недавно — ничего так, фильм может местами и дурной, но в целом очень даже на уровне. Особенно рядом с другими российскими комедиями, которые в последнее время хоть краем глаза смотрел. В отличие от остального сделан профессионально ­— тут тебе и перекрестные диалоги, и продуманные running gags. Саундтрек — так вообще прелесть, все исполнители настолько самоироничны. И Козырев с Уткиным, которые совсем не актеры, очень хорошо вписались. А реалии 90-х представлены так, что вызывают не рвотный рефлекс, а добрую ностальгию.</description>
  <comments>http://ogolberg.livejournal.com/42276.html</comments>
  <category>кино</category>
  <lj:music>Queen - Princes of the Universe</lj:music>
  <media:title type="plain">Queen - Princes of the Universe</media:title>
  <lj:mood>worried</lj:mood>
  <lj:security>public</lj:security>
  <lj:reply-count>2</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://ogolberg.livejournal.com/42154.html</guid>
  <pubDate>Sun, 11 May 2008 23:09:29 GMT</pubDate>
  <title>Любимое пиво</title>
  <link>http://ogolberg.livejournal.com/42154.html</link>
  <description>1. Samuel Adams Boston Ale&lt;br /&gt;2. Shiner Bock&lt;br /&gt;3. Guinness Draught&lt;br /&gt;4. Samuel Adams Summer Ale&lt;br /&gt;5. Corona Extra&lt;br /&gt;&lt;br /&gt;ваше?</description>
  <comments>http://ogolberg.livejournal.com/42154.html</comments>
  <category>опрос</category>
  <lj:music>Daft Punk - Da funk</lj:music>
  <media:title type="plain">Daft Punk - Da funk</media:title>
  <lj:mood>depressed</lj:mood>
  <lj:security>public</lj:security>
  <lj:reply-count>6</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://ogolberg.livejournal.com/41773.html</guid>
  <pubDate>Fri, 09 May 2008 20:45:51 GMT</pubDate>
  <title>Focus mode</title>
  <link>http://ogolberg.livejournal.com/41773.html</link>
  <description>Пару недель назад стал пользоваться point to focus (точнее sloppy focus) вместо click to focus. Первая неделя — немного непривычно. Теперь — в экстазе, думаю, почему не сменил раньше.</description>
  <comments>http://ogolberg.livejournal.com/41773.html</comments>
  <category>tech</category>
  <category>ui</category>
  <lj:music>Сергей Шнуров - Выбора</lj:music>
  <media:title type="plain">Сергей Шнуров - Выбора</media:title>
  <lj:mood>hungry</lj:mood>
  <lj:security>public</lj:security>
  <lj:reply-count>5</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://ogolberg.livejournal.com/41679.html</guid>
  <pubDate>Thu, 08 May 2008 05:53:16 GMT</pubDate>
  <title>OpenOffice 3 beta</title>
  <link>http://ogolberg.livejournal.com/41679.html</link>
  <description>&lt;p&gt;Попробовал новую версию. Наконец используется не только системный freetype, но и его системные настройки&lt;/p&gt;
&lt;p&gt;
&lt;a style=&quot;text-decoration: none; display: inline&quot; href=&quot;http://img246.imageshack.us/img246/7373/ooofontsll2.png&quot;&gt;&lt;img style=&quot;display: inline&quot; src=&quot;http://img246.imageshack.us/img246/7373/ooofontsll2.th.png&quot; /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;Появился «живой» зум-ползунок и табличное расположение всех страниц на экране. Совершенно случайно в недавно дописанной мной программке используется по сути такой же вид — она правда нацелена на макро-редактирование документов, чем обусловлено же это нововведение в OpenOffice, не совсем понятно.&lt;/p&gt;
&lt;p&gt;
&lt;a style=&quot;text-decoration: none; display: inline&quot; href=&quot;http://img246.imageshack.us/img246/8274/ooozoomct8.png&quot;&gt;&lt;img style=&quot;display: inline&quot; src=&quot;http://img246.imageshack.us/img246/8274/ooozoomct8.th.png&quot; /&gt;&lt;/a&gt;
&lt;a style=&quot;text-decoration: none; display: inline&quot; href=&quot;http://img246.imageshack.us/img246/6036/myzoomny0.png&quot;&gt;&lt;img style=&quot;display: inline&quot; src=&quot;http://img246.imageshack.us/img246/6036/myzoomny0.th.png&quot; /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;Из замеченных косяков — если запустить soffice с ключем -calc, -writer или тому подобным, процесс виснет, как только появляется окно. Также, если отображается много страниц одновременно, они почему-то постоянно перерисовываются и дергаются.&lt;/p&gt;
&lt;p&gt;Если бы я использовал WYSIWYG текстовые процессоры, то наверное пересел бы на новую версию только из-за шрифтов.&lt;/p&gt;</description>
  <comments>http://ogolberg.livejournal.com/41679.html</comments>
  <category>f/oss</category>
  <category>tech</category>
  <lj:music>Daft Punk - Veridis quo</lj:music>
  <media:title type="plain">Daft Punk - Veridis quo</media:title>
  <lj:mood>apathetic</lj:mood>
  <lj:security>public</lj:security>
  <lj:reply-count>2</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://ogolberg.livejournal.com/41116.html</guid>
  <pubDate>Fri, 25 Apr 2008 18:30:19 GMT</pubDate>
  <title>A must-have feature</title>
  <link>http://ogolberg.livejournal.com/41116.html</link>
  <description>Гуглил зачем-то нечто типа &amp;ldquo;crop icon&amp;rdquo;, и одной из первых ссылок вышла &amp;ldquo;&lt;a href=&quot;http://1000times1000.com/2007/07/16/why-cropping-is-a-must-have-feature/&quot;&gt;Why cropping is a must have feature&lt;/a&gt;&amp;rdquo;. Прелестно.</description>
  <comments>http://ogolberg.livejournal.com/41116.html</comments>
  <category>забавно</category>
  <lj:music>John Williams - Mario in Mexico</lj:music>
  <media:title type="plain">John Williams - Mario in Mexico</media:title>
  <lj:mood>exhausted</lj:mood>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://ogolberg.livejournal.com/40947.html</guid>
  <pubDate>Sat, 12 Apr 2008 04:37:41 GMT</pubDate>
  <title>За последнюю неделю я выяснил...</title>
  <link>http://ogolberg.livejournal.com/40947.html</link>
  <description>...что от жесткого недосыпа и избытка кофеина моя точность стрельбы падает до пола при медленном огне (2 минуты на выстрел) и стойко возрастает при быстром огне (2 секунды на выстрел),&lt;br /&gt;&lt;br /&gt;девушка в джинсах с &lt;i&gt;очень&lt;/i&gt; низкой талией за соседним столом может испортить эффективность даже самой интересной лекции о дизайне интерфейсов; видимо, потому что вместе с &lt;s&gt;не&lt;/s&gt;прикрываемым очень четко следует &lt;cite&gt;&lt;a href=&quot;http://www.useit.com/papers/heuristic/heuristic_list.html&quot;&gt;Ten Usability Heuristics&lt;/a&gt;&lt;/cite&gt; Нильсена.</description>
  <comments>http://ogolberg.livejournal.com/40947.html</comments>
  <category>мысли</category>
  <lj:music>Placebo - Follow the Cops Back Home</lj:music>
  <media:title type="plain">Placebo - Follow the Cops Back Home</media:title>
  <lj:mood>rejuvenated</lj:mood>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://ogolberg.livejournal.com/40496.html</guid>
  <pubDate>Wed, 02 Apr 2008 19:04:42 GMT</pubDate>
  <title>Слайд-караоке</title>
  <link>http://ogolberg.livejournal.com/40496.html</link>
  <description>Знакомая прислала ссылку на очень забавную &lt;a href=&quot;http://www.boston.com/bostonglobe/ideas/articles/2008/03/02/slide_show/&quot;&gt;статью&lt;/a&gt; о новомоднем развлечении — «PowerPoint Karaoke». Вкратце — достается случайный документ со слайдами, и исполнитель в реальном времени делает по ним презентацию. Там в конце еще очень хорошо написано про большой потенциал этого занятия на рабочем месте.</description>
  <comments>http://ogolberg.livejournal.com/40496.html</comments>
  <category>забавно</category>
  <lj:music>Leonard Cohen - Famous Blue Raincoat</lj:music>
  <media:title type="plain">Leonard Cohen - Famous Blue Raincoat</media:title>
  <lj:mood>peaceful</lj:mood>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://ogolberg.livejournal.com/40425.html</guid>
  <pubDate>Wed, 02 Apr 2008 18:47:23 GMT</pubDate>
  <title>Слава роботам!</title>
  <link>http://ogolberg.livejournal.com/40425.html</link>
  <description>Вот &lt;a href=&quot;http://en.wikipedia.org/wiki/E-cigarette&quot;&gt;это&lt;/a&gt; — настоящая революционная технология.</description>
  <comments>http://ogolberg.livejournal.com/40425.html</comments>
  <category>интересно</category>
  <lj:music>Leonard Cohen - Hey, That&apos;s No Way To Say Goodbye</lj:music>
  <media:title type="plain">Leonard Cohen - Hey, That&apos;s No Way To Say Goodbye</media:title>
  <lj:mood>flirty</lj:mood>
  <lj:security>public</lj:security>
  <lj:reply-count>1</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://ogolberg.livejournal.com/39287.html</guid>
  <pubDate>Fri, 29 Feb 2008 06:32:05 GMT</pubDate>
  <title>GTK+ &amp; LPRng</title>
  <link>http://ogolberg.livejournal.com/39287.html</link>
  <description>Поставил сегодня &lt;a href=&quot;http://www.lprng.com/&quot;&gt;LPRng&lt;/a&gt; для печати в пул разбросанных по сети принтеров с Kerberos-аутентификацией. Поскольку печатаю я в 90% случаев PDF файлы, тут же заметил, что в Evince опции печати через LPR или произвольный pipe нет. Убил кучу времени на поиск решения, даже в итоге уже не помню, где нашел. Оказалось, что Evince использует новый интерфейс GTK+ для печати, о чем я совершенно не подумал. Ну а где могут находиться тогда соответствующие настройки? Правильно &amp;mdash; в gtkrc, в котором свойство gtk-print-backends является списком нескольких значений из &quot;lpr&quot;, &quot;cups&quot; и &quot;file&quot;. Ну и значение по-умолчанию, как уже понятно, &amp;mdash; &quot;file, cups&quot;. Более того &amp;mdash; порядок значений в списке соответствует порядку опций в диалоге печати, что позволяет сделать &quot;Print to LPR&quot; первым, а &quot;Print to File&quot; последним, что больше соответствует логике вещей. Вот так, может у кого-то эта проблема тоже возникнет.</description>
  <comments>http://ogolberg.livejournal.com/39287.html</comments>
  <category>tech</category>
  <category>linux</category>
  <lj:music>Vilayat Khan - Jalshagar [Title Music]</lj:music>
  <media:title type="plain">Vilayat Khan - Jalshagar [Title Music]</media:title>
  <lj:mood>drunk</lj:mood>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://ogolberg.livejournal.com/38970.html</guid>
  <pubDate>Fri, 29 Feb 2008 06:01:39 GMT</pubDate>
  <title>Enter Rosetta</title>
  <link>http://ogolberg.livejournal.com/38970.html</link>
  <description>&lt;p style=&quot;font-style: italic&quot;&gt;&amp;ldquo;You’ll never see it, you’ll never configure it, you’ll never have to think about it&amp;rdquo; &lt;sup&gt;&lt;a href=&quot;#foot-rosetta&quot; style=&quot;text-decoration: none&quot;&gt;*&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;

&lt;p&gt;... пока InDesign CS2 не захардлочит вашу новую распальцованную машинку. Она же, как утверждается, в userspace крутится?&lt;/p&gt;

&lt;p style=&quot;font-size: 80%&quot;&gt;*: &lt;a href=&quot;http://www.apple.com/rosetta/&quot; ref=&quot;nofollow&quot;&gt;http://www.apple.com/rosetta/&lt;/a&gt;&lt;/p&gt;</description>
  <comments>http://ogolberg.livejournal.com/38970.html</comments>
  <category>tech</category>
  <category>wtf</category>
  <lj:music>Peter Sarstedt - Where Do You Go To My Lovely</lj:music>
  <media:title type="plain">Peter Sarstedt - Where Do You Go To My Lovely</media:title>
  <lj:mood>drunk</lj:mood>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://ogolberg.livejournal.com/38616.html</guid>
  <pubDate>Mon, 25 Feb 2008 00:59:57 GMT</pubDate>
  <title>Оскар</title>
  <link>http://ogolberg.livejournal.com/38616.html</link>
  <description>Каждый год для меня вручение Academy Awards &amp;mdash; прежде всего повод посмотреть побольше кино, долго его обсуждать, спорить, и в конце концов выбрать фаворитов для себя. После достаточно долгого затишья в этом году в американском кино было не только количество, но и качество. Поэтому спорить и выбирать приятно, даже если в конце концов Оскара получат совсем не те. Итак, мне очень хочется, чтобы Оскар получили:&lt;br /&gt;&lt;br /&gt;Лучшая музыка к фильму: James Newton Howard, за &amp;laquo;Michael Clayton&amp;raquo;. Просто потому что очень понравилась. Потому что хочется ее слушать и слушать.&lt;br /&gt;&lt;br /&gt;Второстепенная женская роль: Cate Blanchett, за то, что лучше всего изобразила легенду фолка, который &amp;laquo;не там.&amp;raquo;&lt;br /&gt;&lt;br /&gt;Второстепенная мужская роль: Javier Bardem. От одного взгляда его персонажа в &lt;cite&gt;No Country for Old Men&lt;/cite&gt; прошибает холодным потом. Так смотреть и так говорить надо уметь. Также очень хорош Tom Wilkinson, особенно своей эмоциональной дикцией. Не обижусь, если получит он.&lt;br /&gt;&lt;br /&gt;Главная женская роль: Ellen Page. Juno &amp;mdash; это совсем не фильм на одного актера, но многие его части она фактически тянет на себе. Я не знаю, как и кто мог бы сыграть лучше. К сожалению, ей всего 20 и по критерию &amp;laquo;заслуженность&amp;raquo; она явно не проходит.&lt;br /&gt;&lt;br /&gt;Главная мужская роль: George Clooney, за одно его выражения лица в эпизоде &lt;cite&gt;Michael Clayton&lt;/cite&gt; со взрывом машины. Не расстроюсь, если получит Day-Lewis или Depp. &lt;br /&gt;&lt;br /&gt;Лучшая режиссура и лучший фильм: &lt;cite&gt;No Country for Old Men&lt;/cite&gt;, Joel &amp; Ethan Coen. На данный момент этот фильм &amp;mdash; вершина творчества братьев-режиссеров, которые уже сняли очень много оригинального, интересного и очень хорошего кино. &lt;cite&gt;No Country for Old Men&lt;/cite&gt; больше всего похож на их первый фильм &amp;mdash; &lt;cite&gt;Blood Simple&lt;/cite&gt;, но в нем чувствуется уже не талант и перспектива, а профессионализм и гений. Братья уже незаслуженно оказались без главной награды с &lt;cite&gt;Fargo&lt;/cite&gt;, но сегодня должны получить по заслугам.</description>
  <comments>http://ogolberg.livejournal.com/38616.html</comments>
  <category>кино</category>
  <lj:music>Richie Havens - Tombstone Blues</lj:music>
  <media:title type="plain">Richie Havens - Tombstone Blues</media:title>
  <lj:mood>anxious</lj:mood>
  <lj:security>public</lj:security>
  <lj:reply-count>1</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://ogolberg.livejournal.com/37940.html</guid>
  <pubDate>Tue, 19 Feb 2008 18:23:35 GMT</pubDate>
  <title>Летов</title>
  <link>http://ogolberg.livejournal.com/37940.html</link>
  <description>&lt;blockquote style=&quot;display: block; padding: 10px; width: 300px; background-image: url(http://stat.livejournal.com/sixhtml/themes/lilia/theme-beckett/powered-bg.gif) repeat-x scroll 0%; border: #dfc78a solid 1px;&quot;&gt;Live fast, die young, and have a good-looking corpse.
		&lt;p style=&quot;text-align:right; padding: 0 1em 0 0&quot;&gt;
	  Willard Motley. &lt;cite&gt;Knock on Any Door.&lt;/cite&gt;
	&lt;/p&gt;
      &lt;/blockquote&gt;
&lt;p&gt;
&lt;p&gt;
Он был глубоко оригинален. Это отделило его толстой чертой от волны говнорока. Он не боялся противоречиями заигрывать с эмоциями толпы. Не боялся бить по чувствам слушателя. Не боялся, чтобы его любили. Не боялся, чтобы его ненавидели. Не боялся быть непонятым и не боялся быть понятым. Он не погряз в болоте пошлости. Этим и запомнился.
&lt;/p&gt;</description>
  <comments>http://ogolberg.livejournal.com/37940.html</comments>
  <category>жизнь</category>
  <category>музыка</category>
  <lj:music>Гражданская Оборона - Сквозь Дыру в Моей Голове</lj:music>
  <media:title type="plain">Гражданская Оборона - Сквозь Дыру в Моей Голове</media:title>
  <lj:mood>in pain</lj:mood>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://ogolberg.livejournal.com/37427.html</guid>
  <pubDate>Fri, 08 Feb 2008 19:00:59 GMT</pubDate>
  <title>(В)опрос</title>
  <link>http://ogolberg.livejournal.com/37427.html</link>
  <description>Назовите раздражающую вас проблему с пользовательским интерфейсом, с которой вы все время сталкиваетесь, причем не по принуждению &amp;mdash; то есть вам не известен продукт, который эту проблему решает. Она может быть связана с программой на вашем десктопе, интернет сайтами и приложениями, наладонником или телефоном или чем-нибудь совсем нетехническим &amp;mdash; хоть дверными ручками.</description>
  <comments>http://ogolberg.livejournal.com/37427.html</comments>
  <category>ui</category>
  <lj:music>DeVotchKa - Head Honcho</lj:music>
  <media:title type="plain">DeVotchKa - Head Honcho</media:title>
  <lj:mood>lonely</lj:mood>
  <lj:security>public</lj:security>
  <lj:reply-count>9</lj:reply-count>
</item>
</channel>
</rss>
