Создал эту функцию в мокке двумя разными способами. Один работает, тогда как другой не работает. В чем причина? [Дубликат]

В Java все переменные, которые вы объявляете, на самом деле являются «ссылками» на объекты (или примитивы), а не самими объектами.

При попытке выполнить один метод объекта , ссылка просит живой объект выполнить этот метод. Но если ссылка ссылается на NULL (ничего, нуль, void, nada), то нет способа, которым метод будет выполнен. Тогда runtime сообщит вам об этом, выбросив исключение NullPointerException.

Ваша ссылка «указывает» на нуль, таким образом, «Null -> Pointer».

Объект живет в памяти виртуальной машины пространство и единственный способ доступа к нему - использовать ссылки this. Возьмем этот пример:

public class Some {
    private int id;
    public int getId(){
        return this.id;
    }
    public setId( int newId ) {
        this.id = newId;
    }
}

И в другом месте вашего кода:

Some reference = new Some();    // Point to a new object of type Some()
Some otherReference = null;     // Initiallly this points to NULL

reference.setId( 1 );           // Execute setId method, now private var id is 1

System.out.println( reference.getId() ); // Prints 1 to the console

otherReference = reference      // Now they both point to the only object.

reference = null;               // "reference" now point to null.

// But "otherReference" still point to the "real" object so this print 1 too...
System.out.println( otherReference.getId() );

// Guess what will happen
System.out.println( reference.getId() ); // :S Throws NullPointerException because "reference" is pointing to NULL remember...

Это важно знать - когда больше нет ссылок на объект (в пример выше, когда reference и otherReference оба указывают на null), тогда объект «недоступен». Мы не можем работать с ним, поэтому этот объект готов к сбору мусора, и в какой-то момент VM освободит память, используемую этим объектом, и выделит другую.

110
задан hippietrail 20 April 2015 в 08:03
поделиться

4 ответа

Я понимаю это правило большого пальца ...

Для функций, которые эффективно трансформируются (однострочные манипуляции с аргументами), return неявно.

Кандидаты:

// square-root 
value => Math.sqrt(value)

// sum
(a,b) => a+b

Для других операций (более одного уровня, требующих блока, возврат должен быть явным

12
ответ дан Amarsh 18 August 2018 в 18:46
поделиться

Джексон частично ответил на это в аналогичном вопросе:

Неявный возврат, но только если блока нет.

  • ] Это приведет к ошибкам, когда однострочный шрифт будет расширяться до нескольких строк, и программист забывает добавить return.
  • Неявный возврат является синтаксически неоднозначным. (name) => {id: name} возвращает объект {id: name} ... правильно? Неправильно. Он возвращает undefined. Эти фигурные скобки являются явным блоком. id: - это метка.

Я бы добавил к этому определение блока :

Оператор блока (или составной оператор на других языках) используется для группировки нулевых или более операторов. Блок разделен на пару фигурных скобок.

Примеры:

// returns: undefined
// explanation: an empty block with an implicit return
((name) => {})() 

// returns: 'Hi Jess'
// explanation: no block means implicit return
((name) => 'Hi ' + name)('Jess')

// returns: undefined
// explanation: explicit return required inside block, but is missing.
((name) => {'Hi ' + name})('Jess')

// returns: 'Hi Jess'
// explanation: explicit return in block exists
((name) => {return 'Hi ' + name})('Jess') 

// returns: undefined
// explanation: a block containing a single label. No explicit return.
// more: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/label
((name) => {id: name})('Jess') 

// returns: {id: 'Jess'}
// explanation: implicit return of expression ( ) which evaluates to an object
((name) => ({id: name}))('Jess') 

// returns: {id: 'Jess'}
// explanation: explicit return inside block returns object
((name) => {return {id: name}})('Jess') 
194
ответ дан Community 18 August 2018 в 18:46
поделиться
  • 1
    Вы можете неявно возвращать объект, если хотите. Например: ((name) => ({ id: name }))('Louis') – vdclouis 8 July 2015 в 14:24
  • 2
    @vdclouis Да, это второй-последний пример: ((name) => ({id: name}))('Jess') // returns {id: 'Jess'} – Jess Telford 9 July 2015 в 02:06
  • 3
    @MichaelDausmann Это функция стрелки, которая имеет один параметр, name, с функцией, заключенной в круглые скобки и вызываемой одним аргументом, «Jess». Код между => и )('Jess') в каждом случае является телом функции стрелки. Рассматривайте его как краткую форму выражения, выведенной с немедленной вызывной формой (function (name) { return { id: name } })('Jess') – Russ Cam 14 July 2015 в 12:59
  • 4
    столько места для путаницы – dmkc 27 November 2015 в 19:55
  • 5
    Чтобы быть ясным, кажется, что, поскольку парсер JS не знает, ожидать ли выражение (например, выражение, содержащее литерал объекта {}) или block , он предполагает, что a { } обозначает блок. Это означает, что когда он видит id: name, он считает, что id: является выражением, создающим метку (очень необычно используемая функция JS, которая имеет дело с управлением потоком и использует :), а затем name, следующий за id:, - это просто отдельный оператор, который содержит только переменную name (& amp; ничего не делает). – iono 31 July 2018 в 17:32

Здесь есть еще один случай.

При написании функционального компонента в React вы можете использовать круглые скобки для переноса неявно возвращенного JSX.

const FunctionalComponent = () => (
  <div>
    <OtherComponent />
  </div>
);
0
ответ дан Deci 18 August 2018 в 18:46
поделиться

Функции стрелок позволяют иметь неявный возврат: значения возвращаются без использования ключевого слова return.

Он работает, когда в теле функции есть оператор:

const myFunction = () => 'test'

console.log(myFunction()) //'test'

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

const myFunction = () => ({value: 'test'})

console.log(myFunction()) //{value: 'test'}

0
ответ дан Flavio Copes 18 August 2018 в 18:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: