LINUX.ORG.RU

Зачем нужен var в Java?

 , ,


1

2

Как многие уже знают, в Java решили ввести ключевое слово var. Драма разыгралась неслабая (хотя бы на хабре), но никто ещё не смог придумать случай, в котором этот var вообще имеет смысл использовать. Может, хотя бы здесь кто-то всё-таки сможет привести подобный пример?

★★★★

Возьми любой исходник и замени все объявления типов локальных переменных на var, вот тебе и пример.

А они только var решили ввести, или есть и сокращение для final var? И точно решили, или просто очередной JSR состряпали? В какой версии введут?

Legioner ★★★★★ ()

но никто ещё не смог придумать случай, в котором этот var вообще имеет смысл использовать.

По твоей же ссылке эти случаи приведены.

subwoofer ★★★★★ ()

Может, хотя бы здесь кто-то всё-таки сможет привести подобный пример?

сходил по ссылке вместо тебя:

SomeClass.SomInternalClass<String, Integer> foo = new SomeClass.SomInternalClass<~>();
т.е. для всяких
var foo = new SomeClass();
например, если кому-то так удобнее
если тебе дали карандаши всех цветов, то это не значит что нужно их все использовать или ныть что белый никому не нужен

з.ы. мимокрокодил

anTaRes ★★★★ ()
Ответ на: комментарий от anTaRes

Просто чтобы не писать длинное имя класса? Но ведь это может сделать любая уважающая себя IDE, и при этом не заставлять человека, редактирующего код, лишний раз смотреть, что возвращает та или иная функция, чтобы определить тип переменной, объявленной при помощи var.

если тебе дали карандаши всех цветов, то это не значит что нужно их все использовать или ныть что белый никому не нужен

Но ведь мне, возможно, придётся редактировать такой код.

alix ★★★★ ()
Ответ на: комментарий от subwoofer

Разницу я вижу. В первом варианте на 9 символов меньше, но возможно, придётся где-нибудь глянуть, что возвращает функция NetUtils.getOutputStream()

То есть, удобнее не становится.

alix ★★★★ ()
Ответ на: комментарий от alix

Просто чтобы не писать длинное имя класса?

Не только, но и чтобы уменьшить шум в сырцах:

final SomeClass.SomInternalClass<String, Integer> foo = new SomeClass.SomInternalClass<String, Integer>();
Заменяется на это:
val foo = new SomeClass.SomInternalClass<String, Integer>();

foror ★★ ()
Ответ на: комментарий от log4tmp

вторая - общий пример
тоже из каментов:

Но, конечно, чуточку жаль, ведь теперь вместо канонического:
for (Map.Entry<MyTrickyWrapper<String>, MyDomainObject<WithGenericType<AndSubtype>>> e : m.entrySet()) { ... }
Можно будет написать
for (var e : m.entrySet()) { ... }
Бедные пользователи notepad, ну как же им будет сложно понять такой код...

anTaRes ★★★★ ()
Ответ на: комментарий от alix

Я тебе обьясню раз и навсегда. Если тебе после этого не очевидно, второй раз не буду.

Иногда и часто тип переменной очевиден

vertexua ★★☆☆☆ ()
Последнее исправление: vertexua (всего исправлений: 1)
Ответ на: комментарий от alix

Но ведь это может сделать любая уважающая себя IDE, и при этом не заставлять человека, редактирующего код, лишний раз смотреть, что возвращает та или иная функция, чтобы определить тип переменной, объявленной при помощи var.

Сейчас так:

Map<Integer, String> someMap = new HashMap<Integer, String>();

Предлагают так:

var someMap = new HashMap<Integer, String>();

В первом случае, для написания Map<Integer, String> тебе надо либо набрать строку полностью, либо (M + автокомплит) + (I + автокомплит) + (S + автокомплит). Т.е. придётся сделать явно больше трёх нажатий (автокомплит не волшебник, по M, I, S он не выдаст тебе сразу Map, Integer и String первым номером в списке).

Во втором случае набрать надо только var.

Читабельность кода в данном случае не падает, т.к. тип переменной someMap явно виден (а если и не виден, то плюшки IDE исправят эту ситуацию). А вот писать нужно меньше кода.

P.S. В C# var уже много лет как есть. Никто не умер от его наличия ;)

P.S.S. В for var очень удобен. Выше уже указали на это.

Norgat ★★★★ ()
Последнее исправление: Norgat (всего исправлений: 2)
Ответ на: комментарий от anTaRes

Я, как джавист, за. Но есть наркоманы-старперы, которые до сих пор возмущаются, что джава куда-то слишком спешит и вот на 6-ке было всем уютно. У таких, конечно, будет подгорать, и они будут придумывать какие-то невменяемы примеры типа «у меня не получилось, поэтому все плохо», жевать необязательный кактус (по их мнению) и плакать. Короче, все в порядке.

cdshines ★★★ ()
Ответ на: комментарий от anonymous

Очевидно тем, что someMap будет иметь конкретный тип HashMap<Integer, String>, а не Object. Т.е. во-первых, не нужны касты типов. Во-вторых, в IDE полностью работает автокомплит по HashMap.

Norgat ★★★★ ()
Ответ на: комментарий от subwoofer

Если ты не прочитаешь, не означает что не прочитает команда даже средних Scala разработчиков. Проведено а реальных проектах, в том числе в международных банках. Я вот например Fortran прочитать не могу

vertexua ★★☆☆☆ ()
Ответ на: комментарий от vertexua

не я прочитаю, проблема в том что нормальный код на скале читается как hAcK3r-ский изврат на жаве. Т.е. вся соль в том что в среднем он труднее в прочтении. (ну опятьже это субъективщина)

subwoofer ★★★★★ ()

Эта «драма» разыгрывается регулярно, только недавно в C++ была, ровно с теми же аргументами. И даже до плюсофилов дошло, похоже явакодеры решили перехватить лудильное знамя.

anonymous ()
Ответ на: комментарий от Norgat

Читабельность кода в данном случае не падает, т.к. тип переменной someMap явно виден

явно виден

И какого типа будет someMap в данном примере? Map? HashMap?

А если потом допишем:

someMap = new LinkedHashMap<Integer, String>();
?

anonymous ()

Потому-что дегенераты. Вместо чтобы сделать аналог typedef, хотя бы на уровне исходников, для повышения удобства и читаемости, они вводят фичи которые опустят порог вхождения в язык для школоты

FeyFre ★★★★ ()
Ответ на: комментарий от anonymous

И какого типа будет someMap в данном примере? Map? HashMap?

Если тебя это сильно волнует, то ты всегда можешь написать это ручками. В общем случае то, про что ты спрашиваешь, зависит от реализации вывода типов. По хорошему, вывод типов должен вывести тип Map для someMap при присвоении someMap объекта с типом LinkedHashMap.

М.б. вечером чекну, как оно там в C# сейчас. Можешь сам сделать это на IEnumerable<T> типах, если VS есть под рукой.

Norgat ★★★★ ()
Ответ на: комментарий от Norgat

По хорошему, вывод типов должен вывести тип Map для someMap при присвоении someMap объекта с типом LinkedHashMap.

Прекрати думать эти глупости а то они попадут в головы авторов java.

Тип должен явно вычисляться из присваиваемого, а не телепатически.

subwoofer ★★★★★ ()
Ответ на: комментарий от subwoofer

код на скале читается как hAcK3r-ский изврат на жаве.

это пока ты пользуешься явой. а потом вдруг оказывается что слов можно писать просто в разы меньше, правда при этом расплодить типов.

Rastafarra ★★★ ()