LINUX.ORG.RU

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

 , ,


1

2

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

★★★★

var в жабе не нужно, как и сама жаба.

/thread

hateyoufeel ★★★★★
()

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

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

Legioner ★★★★★
()

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

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

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

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

Типа фикс :)

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

доказал «упёртым фонатикам

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

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

Ты это имеешь в виду?

var unbufOut = NetUtils.getOutputStream(sock);
OutputStream unbufOut = NetUtils.getOutputStream(sock);
Что там даёт var?

alix ★★★★
() автор топика

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

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

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

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

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

Да не, я серьёзно, хочу идти в ногу со временем, но пока не знаю, в каком же случае мне понадобится эта фича.

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

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

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

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

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

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

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

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

Отлично, теперь немного философии:

разница - понятие объективное, удобство - субъективное.

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

Если бы было так, я бы там это обсуждал :)

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

Скажи тогда честно и субъективно, лично тебе правда с var будет удобнее, чем с указанием типа?

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

Хотя, если подумать, в случае с использованием new, код сокращается без потери понятности. Так что, спасибо, один юзкейс уже найден!

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

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

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

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

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

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

Но, конечно, чуточку жаль, ведь теперь вместо канонического:
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)
Ответ на: комментарий от alix

ясен перец, а еще если введут вещи позволяющие избавиться от кривых костылей типа lombok

Deleted
()
Ответ на: комментарий от Rastafarra

Хм, Scala и так существует и не отменяет Java 8, которая недавно стала приличным языком

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

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

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

Здрасте! В том, что у var будет выведен конкретный тип.

cdshines ★★★★★
()

Непонятно, что здесь делает тег «хипстеры». Как будто это не банальная фича, а какая-то полиэдрическая конпеляция

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

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

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

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

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

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

Deleted
()

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

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

Вот и сам ответил, это субьективщина. Гарантирую что венгерский и хинди совершенно нечитаемы для меня.

vertexua ★★★★★
()
Последнее исправление: vertexua (всего исправлений: 1)

Ты и прелестей Java 8, поди, не ощутил, потому что for'ы с анонимными классами.

GoodPerson
()
Ответ на: комментарий от 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.

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

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

Если бы я написал new C<D,E,F<G>>() ты бы тоже задал этот вопрос?

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

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

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

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

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

Два раза в одном месте.

А читать еще «веселее» эту лапшу :)

invy ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.