четверг, 16 апреля 2015 г.

Простые задачи на Java. Слабо решить все?


Привет! Мы тут собрали тусовку одних из самых крутых русскоязычных Java-практиков и попросили их дать по задаче, чтобы вы сломали зубы, мозг и бились об стену, пытаясь понять, как это работает. Собственно, мы поспорили на бутылку Хеннеси, что за 12 часов после публикации никто не пришлёт все правильные ответы. Я уверен, что кто-то сможет. Поэтому если вы это сделаете первым – с меня бутылка.


Первая задача простая, она от телезрителя Николая Гарбузова, специалиста по скалкам, любящего рекурсию, паттерн-матчинг и магию компиляции:



Скомпилируется ли следующий аспект AJC компилятором?

Если да — то что он выведет на консоль при компиляции?



public aspect QuizAspect {
public static int count(int i) {
return i++;
}

before (int n) : execution(public int QuizAspect.count(int))
&& args(n) && if(QuizAspect.count(1)>1) {
System.out.println("QuizAspect " + n);
}
}


Пока просто, правда?


Вторая задача от Владимира Ситникова (NetCracker), грязного извращенца во всём, что касается регулярных выражений. Этот нехороший человек даже анонс своего доклада на JPoint написал с их помощью.



В чём подвох удалять Java-комментарии таким выражением? (считаем, что исходник написан нормальными символами) —



Pattern.compile("/\\*(?:[^*]|\\*[^/])*\\*/")


И сразу вторая задача — можно ли написать «hello world» на java без единого пробела?



Третью задачу прислал телезритель Николай Алименков из клуба анонимных разработчиков. 10 лет он пилит свои масштабируемые системы, а к нам пришёл отдохнуть, поэтому задача одна из самых простых:



Есть 2 Spring контекста:


1. a.xml с бином



<util:list id="myList">
<value>3</value>
<value>4</value>
</util:list>


2. b.xml с бином



<util:list id="myList">
<value>6</value>
</util:list>


Что напечатает такой фрагмент кода:



System.out.println(new ClassPathXmlApplicationContext("a.xml", "b.xml").getBean("myList"));


И как можно заставить его бросить ошибку, не изменяя логику работы кода?



Четвёртая задача предоставлена Никитой Сальников-Тарновским, конкретно упоровшимся по хардкору и написавшим инструмент для поиска утечек памяти – Plumbr. Писал не один, конечно, но прочитать полученный код может только он. Долбанный оптимизатор.



Ниже приведены 2 программы. Каждая из них пытается аллоцировать суммарно памяти больше размера хипа. Но одна из них выкидывает java.lang.OutOfMemoryError, а вторая нет. Почему?



public class OOM1 {
private static final int SIZE = (int) (Runtime.getRuntime().maxMemory() * 0.55);

public static void main(String[] args) {
{
byte[] bytes = new byte[SIZE];
System.out.println(bytes.length);
}

byte[] bytes1 = new byte[SIZE];
System.out.println(bytes1.length);

System.out.println("I allocated memory successfully");
}
}

public class OOM2 {
private static final int SIZE = (int) (Runtime.getRuntime().maxMemory() * 0.35);

public static void main(String[] args) {
{
byte[] bytes = new byte[SIZE];
System.out.println(bytes.length);
}

byte[] bytes1 = new byte[SIZE];
System.out.println(bytes1.length);

byte[] bytes2 = new byte[SIZE];
System.out.println(bytes2.length);

System.out.println("I allocated memory successfully");
}
}




Предпоследняя задача от Баруха Садогурского из JFrog и тусовки Bintray/Artifactory



Что выведет этот код?



def back = 'back'
def quotes = ["I'll be $back",
"I'll be ${-> back}",
"I'll be ${back}",
"I'll be "+back]
println quotes
back = 'bach'
println quotes


Последняя – от Евгения Борисова, тренера офицеров израильской армии по Java. Spring:



Есть два бина:



@Component
public class Няня {
public void closeAll() {
while (ребёнокГрязный()) {
купайРебёнка();
}
}
}

@Component
public class Уборщица {
public void closeAll() {
while (посудаГрязная()) {
мойПосуду();
}
}
}




Как сделать, чтобы при закрытия контекста, оба метода closeAll работали параллельно (и какие есть варианты)?

Ачивки и решения





  • Небольшой сувенир первому, кто запостит три правильных решения под спойлер в комментарии.

  • Бутылка Хеннеси – тому, кто сможет за 12 часов правильно ответить на все вопросы за один раз. Если таких будет несколько – первому, приславшему правильные ответы.

  • Бесплатные билеты для вас и друга на конференцию JPoint в понедельник тому, кто сможет поправить или существенно доуточнить ответы тех, кто задавал задачи.


Ответы, пожалуйста, в комментарии под спойлер. Если вы не можете комментировать, то делайте #jpoint в Facebook или ВКонтакте.


Завтра я выложу правильные ответы на первые три вопроса, а в среду — на вопросы jbaruch и EvgenyBorisov.


This entry passed through the Full-Text RSS service - if this is your content and you're reading it on someone else's site, please read the FAQ at http://ift.tt/jcXqJW.


Комментариев нет:

Отправить комментарий