Что такое var в информатике
Перейти к содержимому

Что такое var в информатике

  • автор:

FAQ по var в Java

Локальные переменные — это «рабочие лошадки» Java. Они используются для хранения промежуточных результатов вычислений. И, в отличие от полей, объявляются, инициализируются и используются в одном блоке. Для понимания кода часто более важны имя и инициализатор, чем тип локальной переменной. В имени и инициализаторе столько же информации, сколько и в типе:

Person person = new Person();

Вместо явного указания типа можно использовать var :

var person = new Person();

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

Вопрос 2. Делает ли это Java динамически типизированным языком? Это то же самое, что и var в JavaScript?

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

В компиляторе Java выведение типов присутствует уже много лет. Например, параметры лямбда-выражения в Java 8 не нуждаются в явном указании типа, так как компилятор определяет их по тому, как используется лямбда-выражение:

List list = . list.stream().filter(p -> p.getAge() > 18) . 

В приведенном выше фрагменте кода тип параметра p в лямбде выводится как Person . Если класс Person будет изменен так, что в нем больше не будет метода getAge , или в списке будет храниться что-то отличное от Person , то выведение типа завершится ошибкой при компиляции.

Вопрос 3. Переменная var неявно final?

Нет. Локальные переменные, объявленные с помощью var , по умолчанию не являются final . Однако к var можно добавить модификатор final :

final var person = new Person();

Для final var в Java нет никакого сокращения. Например, в Scala для объявления неизменяемых переменных используется val . В Scala это хорошо работает, потому что все переменные (и локальные, и поля) объявляются с помощью синтаксиса следующего вида.

val name : type
var name : type

Указывать » : type » в объявлении необязательно — это зависит от того, хотите ли вы использовать выведение типа или нет. В Scala выбор между изменяемостью и неизменяемостью ортогонален к выведению типов.

В Java var можно использовать только там, где требуется выведение типа. Его нельзя использовать, если тип объявлен явно. Если в Java добавить val , то его тоже можно было бы использовать только там, где используется выведение типов. В Java нельзя было бы использовать var или val для управления иммутабельностью при явном объявлении типа.

Кроме того, Java позволяет использовать var только для локальных переменных, но не для полей. Для полей иммутабельность более значима. Неизменяемые локальные переменные используются сравнительно редко.

Использование ключевых слов var/val для управления иммутабельностью — это то, что действительно стоит позаимствовать из Scala в Java. Однако в Java это было бы гораздо менее полезно, чем в Scala.

Вопрос 4. Не будут ли плохие разработчики злоупотреблять var, чтобы писать ужасный код?

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

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

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

Начиная с выведения типа локальной переменной (Local Variable Type Inference, LVTI), мы публикуем материалы о назначении и рекомендации по использованию (например, данный FAQ и LVTI Style Guidelines) почти одновременно с появлением этой функциональности. Мы надеемся, что это ускорит понимание в сообществе, когда разумно использовать var , и поможет избежать злоупотребления.

Вопрос 5. Где можно использовать var?

var может использоваться при объявлении локальных переменных, включая индексные переменные цикла for и ресурсные переменные оператора try-with-resources .

var нельзя использовать для полей, параметров методов и возвращаемых типов методов. Причина заключается в том, что типы в этих местах явно присутствуют в class-файлах и в спецификациях Javadoc. При выведении типа изменение инициализатора может легко привести к изменению предполагаемого типа переменной. Для локальных переменных это не проблема, так как область видимости локальных переменных ограничена, и их типы напрямую не записываются в class-файлы. Однако для полей, параметров методов и типов, возвращаемых методом, выведение типа может легко вызвать проблему.

Например, возвращаемый тип метода был выведен из выражения в операторе return . Изменение реализации метода может привести к изменению типа выражения в return . Это, в свою очередь, может изменить тип возвращаемого значения. Что может привести к бинарной несовместимости или несовместимости в исходном коде. Такие несовместимые изменения не должны возникать из-за безобидных на вид изменений в реализации.

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

Выведение типа допустимо в реализации, но не в API. API-контракты должны быть объявлены явно.

Как насчет private-полей и методов, которые не являются частью API? Теоретически мы могли бы реализовать поддержку var для private-полей и возвращаемых типов для private-методов, не опасаясь, что это вызовет несовместимость из-за раздельной компиляции и динамической линковки. Но для простоты мы решили ограничить область выведения типов. Если расширить границы и включить отдельные виды полей и типы, возвращаемые некоторыми методами, то это сделает все значительно более сложным и трудным для понимания, и лишь незначительно более полезным.

Вопрос 6. Почему для var всегда нужен инициализатор в правой части?

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

Допустим, мы разрешили выведение типа на основе присваивания в нескольких местах, отдельно от объявления переменной. Тогда рассмотрим следующий пример:

var order; . order = "first"; . order = 2;

Если тип был выбран на основе, например, первого присваивания, то это может привести к ошибке в другом операторе, весьма удаленном от местоположения настоящей ошибки. (Иногда это называют проблемой «дальнодействия».)

В качестве альтернативы можно выбрать тип, совместимый со всеми присваиваниями. И в этом случае можно ожидать, что выведенный тип будет Object , как общий суперкласс String и Integer . К сожалению, ситуация сложнее. Поскольку и String , и Integer являются Serializable и Comparable , общий супертип будет пересечением типов, что-то вроде

Serializable & Comparable>

Обратите внимание, что невозможно явно объявить переменную этого типа. Также это приводит к упаковыванию (boxing), когда order присваивается 2, что может быть неожиданным и нежелательным.

Чтобы избежать подобных проблем, проще потребовать вывод типа с использованием явного инициализатора.

Вопрос 7. Почему нельзя использовать var с null?

Посмотрите на такое объявление (оно некорректно):

var person = null; // ОШИБКА

Литерал null обозначает значение специального типа null (JLS 4.1), который является подтипом всех ссылочных типов в Java. Единственным значением типа null является сам null , поэтому единственное значение, которое может быть присвоено переменной типа null — это null . Это не очень полезно.

Можно ввести специальное правило, чтобы объявление var , инициализированное значением null , имело тип Object . Но возникает вопрос о намерениях программиста. Предположим, что переменная инициализируется значением null , чтобы позже ей присвоить какое-либо другое значение. Но в этом случае маловероятно, что определение типа переменной как Object будет правильным.

Вместо того чтобы создавать какие-то специальные правила для обработки этого случая, мы его запретили. Если вам нужна переменная типа Object , объявите ее явно.

Вопрос 8. Можно ли использовать var с diamond-оператором справа?

Да, это работает, но, скорее всего, не так, как вы ожидаете. Пример:

var list = new ArrayList<>();

Тип списка будет ArrayList . В общем, лучше указывать явный тип слева с diamond-оператором справа или использовать var слева с явным типом справа. См. особенности использования var с diamond-оператором и дженериками в LVTI Style Guidelines (Руководство по стилю LVTI).

Приглашаем всех желающих на открытое занятие «Реляционные базы данных для начинающих Java-разработчиков». Поговорим о месте реляционных баз данных в архитектуре информационных систем. Рассмотрим основные компоненты и возможности РСУБД на примере PostgreSQL. Сделаем обзор основных технологий по работе с реляционными БД в Java (JDBC, JPA/Hibernate, Spring Data и др.) Регистрация по ссылке.

  • Блог компании OTUS
  • Программирование
  • Java

Что такое Var и Let, их функции и какая разница между ними

Lorem ipsum dolor

Он также используется для объявления переменных в коде. Однако применяется только в тех случаях, когда нужно объявить переменную, которую нельзя будет изменять. То ест ь с оздает своего рода константу из переменной.

Однако не стоит путать с математическими константам и т ипа «числа Пи». Объявляя «число Пи», также нужно будет использовать оператор «const», но его можно использовать и в любых других случаях. Например:

const banana = 15

В этом случа е е сли переменная «banana» будет равна любому другому значению, то в коде возникнет ошибка.

Если рассматривать технические тонкости переменной «const», то тут полная идентичность с объявлением переменных при помощи оператора «let». Поэтому разница между «const» и «var» будет так ой же , как и разница между «let» и «var», при этом добавляется пункт, что «const» объявляет константу. Разница между «const» и «let» заключается в том, что переменная «let» может быть перезаписана в дальнейшем, а переменная «const» не может, так как ее значение защищено и зафиксировано.

Однако нужно отметить, что в случаях, когда с помощью оператора «const» объявляется объект или массив, «постоянством» будет обладать сам объект или массив, но не значения, которы е хранятся внутри. Например:

const worker =

name : «Тихон»

age: «23»

>

В этом случае будут допустимыми изменения типа:

worker.name = «Дормидонт»;

worker.age = «58»;

Но недопустимым и будут изменения типа « worker = 10 » , это вызовет ошибку в коде. Точно такая же ситуация будет возникать и при работе с массивами-константами.

Заключение

Оператор «var» пришел в язык программирования JavaScript намного раньше, чем «let» и «const». Хоть он и считается «устаревшей технологией», он до сих пор активно применяется многими JS-разработчиками. «Let» и «const» были «введены» в язык немного позже и уже стали рекомендованными операторами для объявления переменных.

Мы специальн о в сегодняшней публикации объяснили , в чем разница между «let», «var» и «const», чтобы вам было легче между ними выбрать . Использование «var» не является ошибкой, однако код с этим оператором иногда ведет себя очень непредсказуемо, поэтому его применение требует понимания процессов JavaScript. «Let» и «const» более «строгие», поэтому исключают многие неочевидные ошибки в скриптах. Поэтом у л учше обучаться использовать для переменных именно эти операторы.

Мы будем очень благодарны

если под понравившемся материалом Вы нажмёте одну из кнопок социальных сетей и поделитесь с друзьями.

Что такое var в информатике

Оператор var объявляет переменную, инициализируя её, при необходимости.

Интерактивный пример

Синтаксис

var varname1 [= value1 [, varname2 [, varname3 . [, varnameN]]]];

Имя переменной. Может использоваться любой допустимый идентификатор.

Значение переменной. Любое допустимое выражение. По умолчанию значение undefined.

Описание

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

Присвоение значения необъявленной переменной подразумевает, что она будет создана как глобальная переменная (переменная становится свойством глобального объекта) после выполнения присваивания значения. Различия между объявленной и необъявленной переменными следующие:

1. Объявленные переменные ограничены контекстом выполнения, в котором они были объявлены. Необъявленные переменные всегда глобальны.

function x()  y = 1; // возбудит ReferenceError в "строгом режиме" var z = 2; > x(); console.log(y); // выведет "1" console.log(z); // возбудит ReferenceError: z не определён вне x 

2. Объявленные переменные инициализируются до выполнения любого кода. Необъявленные переменные не существуют до тех пор, пока к ним не выполнено присваивание.

.log(a); // Возбудит ReferenceError. console.log("still going. "); // Не выполнится. 
var a; console.log(a); // Выведет "undefined" или "", в зависимости от браузера. console.log("still going. "); // Выведет "still going. ". 

3. Объявленные переменные, независимо от контекста выполнения, являются ненастраиваемыми свойствами. Необъявленные переменные это настраиваемые свойства (т.е. их можно удалять).

var a = 1; b = 2; delete this.a; // Возбудит TypeError в "строгом режиме". В "нестрогом режиме" будет ошибка без уведомления. delete this.b; console.log(a, b); // Возбудит ReferenceError. // Свойство 'b' было удалено и больше не существует. 

Из-за перечисленных различий, использование необъявленных переменных может привести к непредсказуемым последствиям. Рекомендовано всегда объявлять переменные, вне зависимости, находятся они внутри функции или в глобальном контексте. Присваивание значения необъявленной переменной в строгом режиме (en-US) ECMAScript 5 возбуждает ошибку.

Поднятие переменных

Объявление переменных (как и любые другие объявления) обрабатываются до выполнения кода. Где бы не находилось объявление, это равнозначно тому, что переменную объявили в самом начале кода. Это значит, что переменная становится доступной до того, как она объявлена. Такое поведение называется «поднятием» (в некоторых источниках «всплытием»).

= 2; var bla; // . // читается как: var bla; bla = 2; 

Поэтому объявление переменных рекомендовано выносить в начало их области видимости (в начало глобального кода или в начало функции). Это даёт понять какие переменные принадлежат функции (т.е. являются локальными), а какие обрабатываются в цепи областей видимости (т.е. являются глобальными).

Важно отметить, что подъем будет влиять на объявление переменной, но не на инициализацию её значения. Значение присваивается при выполнении оператора присваивания:

function do_something()  console.log(bar); // выведет undefined var bar = 111; console.log(bar); // выведет 111 > // . неявно понимается как: function do_something()  var bar; console.log(bar); // выведет undefined bar = 111; console.log(bar); // выведет 111 > 

Understanding Value at Risk (VaR) and How It’s Computed

Will Kenton is an expert on the economy and investing laws and regulations. He previously held senior editorial roles at Investopedia and Kapitall Wire and holds a MA in Economics from The New School for Social Research and Doctor of Philosophy in English literature from NYU.

Updated March 23, 2023
Reviewed by
Reviewed by Thomas Brock

Thomas J. Brock is a CFA and CPA with more than 20 years of experience in various areas including investing, insurance portfolio management, finance and accounting, personal investment and financial planning advice, and development of educational materials about life insurance and annuities.

Fact checked by
Fact checked by Ryan Eichler

Ryan Eichler holds a B.S.B.A with a concentration in Finance from Boston University. He has held positions in, and has deep experience with, expense auditing, personal finance, real estate, as well as fact checking & editing.

What Is Value at Risk (VaR)?

Value at risk (VaR) is a statistic that quantifies the extent of possible financial losses within a firm, portfolio, or position over a specific time frame. This metric is most commonly used by investment and commercial banks to determine the extent and probabilities of potential losses in their institutional portfolios.

Risk managers use VaR to measure and control the level of risk exposure. One can apply VaR calculations to specific positions or whole portfolios or use them to measure firm-wide risk exposure.

Key Takeaways

  • Value at risk (VaR) is a way to quantify the risk of potential losses for a firm or an investment.
  • This metric can be computed in three ways: the historical, variance-covariance, and Monte Carlo methods.
  • Investment banks commonly apply VaR modeling to firm-wide risk due to the potential for independent trading desks to unintentionally expose the firm to highly correlated assets.

Value at Risk

Understanding Value at Risk (VaR)

VaR modeling determines the potential for loss in the entity being assessed and the probability that the defined loss will occur. One measures VaR by assessing the amount of potential loss, the probability of occurrence for the amount of loss, and the time frame.

For example, a financial firm may determine an asset has a 3% one-month VaR of 2%, representing a 3% chance of the asset declining in value by 2% during the one-month time frame. The conversion of the 3% chance of occurrence to a daily ratio places the odds of a 2% loss at one day per month.

Using a firm-wide VaR assessment allows for the determination of the cumulative risks from aggregated positions held by different trading desks and departments within the institution. Using the data provided by VaR modeling, financial institutions can determine whether they have sufficient capital reserves in place to cover losses or whether higher-than-acceptable risks require them to reduce concentrated holdings.

VaR Methodologies

There are three main ways of computing VaR: the historical method, the variance-covariance method, and the Monte Carlo method.

Historical Method

The historical method looks at one’s prior returns history and orders them from worst losses to greatest gains—following from the premise that past returns experience will inform future outcomes. See “Value at Risk (VaR) Example” below for the formula and how it’s calculated.

Variance-Covariance Method

Rather than assuming that the past will inform the future, the variance-covariance method, also called the parametric method, instead assumes that gains and losses are normally distributed. This way, potential losses can be framed in terms of standard deviation events from the mean.

The variance-covariance method works best for risk measurement in which the distributions are known and reliably estimated. It is less reliable if the sample size is very small.

Monte Carlo Method

A third approach to VaR is to conduct a Monte Carlo simulation. This technique uses computational models to simulate projected returns over hundreds or thousands of possible iterations. Then, it takes the chances that a loss will occur—say, 5% of the time—and reveals the impact.

The Monte Carlo method can be used with a wide range of risk measurement problems and relies upon the assumption that the probability distribution for risk factors is known.

Distribution of Daily Returns

Advantages of Value at Risk (VaR)

There are several advantages to using VaR in risk measurement:

  1. It is a single number, expressed as a percentage or in price units, and is easily interpreted and widely used by financial industry professionals.
  2. VaR computations can be compared across different types of assets—shares, bonds, derivatives, currencies, and more—or portfolios.
  3. Thanks to its popularity, VaR is often included and calculated for you in various financial software tools, such as a Bloomberg terminal.

Disadvantages of Value at Risk (VaR)

One problem is that there is no standard protocol for the statistics used to determine asset, portfolio, or firm-wide risk. Statistics pulled arbitrarily from a period of low volatility, for example, may understate the potential for risk events to occur and the magnitude of those events. Risk may be further understated using normal distribution probabilities, which rarely account for extreme or black swan events.

Another disadvantage is that the assessment of potential loss represents the lowest amount of risk in a range of outcomes. For example, a VaR determination of 95% with 20% asset risk represents an expectation of losing at least 20% one of every 20 days on average. In this calculation, a loss of 50% still validates the risk assessment.

The financial crisis of 2008 that exposed these problems as relatively benign VaR calculations understated the potential occurrence of risk events posed by portfolios of subprime mortgages. Risk magnitude was also underestimated, which resulted in extreme leverage ratios within subprime portfolios. As a result, the underestimations of occurrence and risk magnitude left institutions unable to cover billions of dollars in losses as subprime mortgage values collapsed.

Value at Risk (VaR) Example

The formula sounds easy, as it only has a few inputs. However, manually calculating the VaR for a large portfolio is computationally laborious.

Though there are several different methods of calculating VaR, the historical method is the simplest:

Value at Risk = vm (vi / v(i — 1))

M is the number of days from which historical data is taken, and vi is the number of variables on day i. The purpose of the formula is to calculate the percent change of each risk factor for the past 252 trading days (the total number in a year). Each percent change is then applied to current market values to determine 252 scenarios for the security’s future value.

What is the value at risk (VaR) formula?

You can use several different methods, with different formulas, to calculate VaR, but the simplest method to manually calculate VaR is the historical method. In this case, m is the number of days from which historical data is taken and vi is the number of variables on day i.

Value at risk formula (using the historical method):
vm (vi / v(i — 1))

What is the difference between value at risk (VaR) and standard deviation?

Value at risk (VaR) is a measure of the potential loss that an asset, portfolio, or firm might experience over a given period of time. Standard deviation, on the other hand, measures how much returns vary over time. It is a measure of volatility in the market: The smaller the standard deviation, the lower an investment’s risk, and the larger the standard deviation, the more volatile it is.

What is marginal value at risk (VaR)?

Marginal VaR is a calculation of the additional risk that a new investment position will add to a portfolio or a firm. It is simply an estimate of the change in the total amount of risk, not the precise amount of risk that a position is adding to or subtracting from the whole portfolio. That more precise measurement is known as incremental VaR.

The Bottom Line

Value at risk (VaR) is a well-known, commonly used risk assessment technique. The VaR calculation is a probability-based estimate of the minimum loss in dollar terms expected over a period. The data produced is used by investors to strategically make investment decisions.

VaR is often criticized for offering a false sense of security, as VaR does not report the maximum potential loss. One of its limitations is that the statistically most likely outcome isn’t always the actual outcome.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *