Pull to refresh

Comments 93

Поздравляю нас всех с этим событием. Никак не ожидал, что пройдет так мало времени между выпуском релиз-кандидата и релиза!
Все даты выхода висели на сайте openjdk уже несколько месяцев.
Наблюдая за людьми, вогоны снова включили свою трансляцию.
— Не имеет смысла вести себя так, будто вы удивлены. Все чертежи,
планы и распоряжения о сносе висели на доске объявлений в местном отделении
по планированию на Альфе Центавра в течение пятидесяти земных лет.
Сайт open jdk ведь не на альфе центавра находится, да и сообщалось в разных источниках не раз. Если конечно не следить, и не интересоваться — тогда да.
Внеочередной праздник! Ура товарищи!
А пользователи Mac OS X в пролёте :( Netbeans стоит, бандл подсунуть могу, а сам JDK 7 нету, может кто знает как можно адаптировать? в macports еще нету.

p.s. OS X Lion стоит.
Я на льва open jdk 7 поставил, все ок
Можно даже за это выпить. Молодцы!
UFO just landed and posted this here
И без аннотированных типов.
советую также подписаться на java magazine. мне на почту пришел свежий номер в .pdf :)
UFO just landed and posted this here
UFO just landed and posted this here
Это правда? Как-то не верится прямо…
Я не разрабатываю на java и смотрю на это как конь на новые ворота… я думал они еще года 2 разрабатывать будут.
через год уже java 8 обещают
а чего там успевать? все давно написано, просто политический кризис в совете не дает ходу фичам.
мне к тому же кажется, было бы неправильным выпускать сразу большой набор обновлений в языке, которые включают 7 и 8 версии. За год разработчики как раз привыкнут к новому в java 7 и будет легче переходить на 8 версию
ну, вот так с 2005го привыкали.
Лямбды есть в JRuby, Scala, Clojure, Mirah, Jython — выбирайте по вкусу!
Я знаю, но у эти языки либо плохо распространены у нас в стране, либо используются не в том секторе, что мне интересен. Долгое время увлекался Python, сейчас свои собственные проекты пишу на Ruby.

Надежда оставалась до последнего. Теперь буду ждать Java 8.
Мало дождаться релиза Java 8. Надо, чтоб эта Java пошла в продакшн, а это может растянуться еще на пару лет после релиза.
Я нечаянно, пардон-пардон!
UFO just landed and posted this here
Это прекрасно! Так когда выходить Java SE 8 со столь желанными Lambda Expressions? :)
Конец света тоже обещают в конце 2012. Как бы даты не совпали…
Так а вы еще по поняли от чего конец света будет? ;)
Как приятно видеть, что любимый язык развивается!
А что вы называете развитием? 5 кусочков синтаксического сахара?
Вы читали что входит в этот Project Coin? Один синтаксический сахар.
Да, но тот же multi-catch очень удобная штука, равно как и использование строк в switch.
Может и так, но ничего радикально нового добавлено не было. Не понимаю всеобщего восторга по этому поводу.

Впрочем, мне все равно не скоро пришлось бы вкусить прелестей новой версии — энтрепрайз штука довольно инертная, много очень больших проектов в моей компании до сих пор разрабатываются на платформе 1.4.
а как же продвинутый try-with-resources? Теперь же мона обойтись без многоэтажных кэтчей!
UFO just landed and posted this here
зачем, если работает?
UFO just landed and posted this here
Немного неправильно выразился — у многих заказчиков стоит 8-ой веблоджик и апгрейдиться они совсем не хотят.
Радикально новое, это буквы задом-наперед переставлять?
А вы читали, для чего этот проект? Для синтаксического сахара!
UFO just landed and posted this here
А мне кто-нибудь может про invokedynamic объяснить? Что-то я не понял, что это и зачем нужно.
java.sun.com/developer/technicalArticles/DynTypeLang/index.html
With the addition of support for JSR 292 in JDK 7, dynamically typed languages should run faster in the JVM than they do today. A key part of this support is the addition of a new Java bytecode, invokedynamic, for method invocation, and an accompanying linkage mechanism that involves a new construct called a method handle. These features enable implementers of compilers for dynamically typed languages, that is, the people who develop compilers for languages such as JRuby and Jython, to generate bytecode that runs extremely fast in the JVM.
Есть хорошее видео об, где на пальцах пытаются рассказть что это и зачем в обще оно там.
(см. там «A Renaissance VM: One Platform, Many Languages» John R. Rose, Da Vinci Machine Project Lead)
А мне кто-нибудь может про invokedynamic объяснить? Что-то я не понял, что это и зачем нужно.
Если коротко, то JVM заточена под статически типизированную Java, что создает некоторые проблемы для динамически типизируемых языков. InvokeDynamic помогает лучше подружиться динамически типизируемым языкам с JVM. А вообще подробные разъяснения по теме первые же строчки поисковой выдачи, например здесь
Просто при декомпиляции того же груви (который может быть и динамически типизован) мы видим тип Object. Видимо, я плохо понимаю, что такое байт-код.
Просто считайте, что компилятор Groovy для Java7 будет выдавать более эффективно работающий байт код.
Только что проделал так

С:\Users\Timur>java -version
java version «1.7.0»
Java(TM) SE Runtime Environment (build 1.7.0-b147)
Java HotSpot(TM) Client VM (build 21.0-b17, mixed mode, sharing)

Я правильно понимаю что это build 147 который был доступен ранее?
Я тоже так подумал. Значит RC хорошо сделали :)
А когда сделают поддержку JDK 7 в WebLogic?
УРА УРА УРА!
Сегодня нужно залиться кофем по полную!
Быстрее б начал поддерживать приятые плюшки JDK 7 Android
О как интересно.
Мне давно хотелось в java использовать string в switch
Исходник:

public class Test {

public static void main(String[] args) {
String test = "string0";
switch(test){
case "string0":
System.out.println("It's works!");
break;
}

}

}


Компилируем седьмой жабой — компилится, работает!

Смотрим декомпилером Test.class:

import java.io.PrintStream;

public class Test
{
public static void main(String[] paramArrayOfString)
{
String str1 = "string0";
String str2 = str1; int i = -1; switch (str2.hashCode()) { case -1881759169:
if (!str2.equals("string0")) break; i = 0; } switch (i) {
case 0:
System.out.println("It's works!");
}
}
}


Забавно они эту фичу реализовали.
Вот жеш ёперный бабай! Я конечно понимаю, что я чего-то не понимаю, но неужеле нельзя было просто switch по str2.hashCode(), или по битам сделать?
Просто по hashCode, видимо, стрёмно — а ВДРУГ найдецца еще строка с таким же hashCode?

Но вообще забавно. Надо будет посмотреть, сколько будут «стоить» эти новые синтаксическо-сахарные фичи.
Просто по hashCode, видимо, стрёмно — а ВДРУГ найдецца еще строка с таким же hashCode?
Что значит «видимо», что значит «вдруг»? Так нельзя делать принципиально алгоритмически, даже странно, что надо о таком говорить. И так не делается никогда. В том числе при реализации любых хеш-таблиц, в том же HashMap ищется сначала по хеш-коду, а потом обязательно делается equals, и почему — должно быть очевидно любому программисту. Тем более, что вероятность коллизий хешкода строки просто огромна.
Да это все понятно, своими «видимо» и «ВДРУГ» я пытался сарказм изобразить — не получилось.
Разумеется, возможны коллизии.
Ну да, я просто перепугался что-то слишком :) Не «возможны», а обязательно будут. За полминуты пример подобрал:
System.out.println("6R".hashCode());
System.out.println("5q".hashCode());
Вывод:
1756
1756
Вот офигенный бы «свич по хешкоду» получился :)
О! Спасибо за пример!
Теперь можно посмотреть на Test2 — малость поинтереснее.

Исходник:
public class Test2 {
public static void main(String[] args) {
String test = "6R";
switch(test){
case "6R":
System.out.println("Ok");
break;
case "5q":
System.out.println("Fail");
break;
}
}
}


Результат декомпиляции:
import java.io.PrintStream;

public class Test2
{
public static void main(String[] paramArrayOfString)
{
String str1 = "6R";
String str2 = str1; int i = -1; switch (str2.hashCode()) { case 1756:
if (str2.equals("5q")) { i = 1; } else { if (!str2.equals("6R")) break; i = 0; } }
switch (i) {
case 0:
System.out.println("Ok");
break;
case 1:
System.out.println("Fail");
}
}
}
Ну так вот, я про что и говорю. По-моему всё логично, я не знаю чего тут такого и чего недоумевают все. Понятно, что содержимое case-блоков второго switch можно было рассовать по этим веткам первого свича, заместо присваивания временной переменной индекса и последующего свича. Но почему-то вот было сделано именно так, возможно, есть какая-то причина и для этого*. В любом случае без первого свича с if-ветками внутри обойтись нельзя, тут уже всё ясно.

*Подумал, что и на это я могу предположить ответ. Всё сделано для сложного свича, типа
switch(test){
case "6R":
case "blabla":
System.out.println("Ok");
break;
case "5q":
...
Ну и попробуйте его реализовать, распихивая это по веткам первого свича. Это невозможно ведь, не правда ли?
Ну да, меня больше удивила переменная с временным индексом — я ожидал «рассовывания» по веткам первого свитча.

Хотя действительно — в случае сложного свитча (как у вас в примере) «протестного чувства» практически нет :-)

import java.io.PrintStream;

public class Test3
{
public static void main(String[] paramArrayOfString)
{
String str1 = "6R";
String str2 = str1; int i = -1; switch (str2.hashCode()) { case 1756:
if (str2.equals("5q")) { i = 2; } else { if (!str2.equals("6R")) break; i = 0; } break;
case -1386582880:
if (!str2.equals("blabla")) break; i = 1; } switch (i) {
case 0:
case 1:
System.out.println("Ok");
break;
case 2:
System.out.println("Fail");
}
}
}
Вот и разгадана загадка дня ;)
Я вот только не пойму, для чего вот это делается:
String str2 = str1;
А может декомпилер так неправильно декомпилирует?

Кстати, у вас неправильно написано: It's works
кстати, да, тоже была мысль, может декомпилер портачит?
Вряд ли декомпилятор работает неправильно. Он может предложить плохочитаемый код или отказаться работать, если встретит неизвестную инструкцию. Но раз все декомпилировалось, можно с уверенностью утверждать, что характер представления swich по строковому параметру аналогичен полученному коду.
Может быть, конечно, но вроде бы оснований не доверять ему нет — код вполне осмыслен, и раньше он («он» — в смысле «декомпилер») меня не подводил.

Впрочем, посмотрел для очистки совести и другим, более «низкоуровневым» — и, насколько я понял, там та же «пляска» с хешем и сравнением строки: image

С английским — да, грешен :-(
Да, похоже на правду. Грустно.
Ладно я ещё могу понять проверку на идентичность: str2.equals(«string0») — мало ли что могло произойти :)
Но два switch по hashCode и по int выглядит по меньшей мере странно.
Зато это должно быть дешевле, чем замена на if(str.equals(case1)){...}else if(str.equals(case2))…
Собственно, на Java One задавали вопрос, будет ли эта конструкция реализована, как if'ы с equals? Ответ был таков: «Нет. Она будет на хешах. Для скорости.»
Ура! Наконец-то. Всех поздравляю с релизом и всем наливаю плюсов… На сколько хватило на столько расставил плюсов всем отписавшимся в этой тем ;) Сегодня праздник. Гулять так гулять! :)
Отличная новость!

Мы ждали этого события 4 года, 7 месяцев и 17 дней.
UFO just landed and posted this here
На продакшн ставить дураков нет надеюсь, а netbeans из под него запустил, ну что сказать, работает…
Во всех жалобах с Lucene я увидел, что там используется Server VM на 64 бит.
Sign up to leave a comment.

Articles