Закрытия в Java - различия в синтаксисе между тремя главными предложениями?

SetWindowLongPtr был создан для замены SetWindowLong в этих экземплярах. Это - параметр LONG_PTR, позволяет Вам хранить указатель для 32-разрядных или 64-разрядных компиляций.

LONG_PTR SetWindowLongPtr(      
    HWND hWnd,
    int nIndex,
    LONG_PTR dwNewLong
);

Помнят, что константы изменились также, таким образом, использование теперь похоже:

SetWindowLongPtr(hWnd, GWLP_USERDATA, this);

Также не забывают, что теперь для получения указателя необходимо использовать GetWindowLongPtr:

LONG_PTR GetWindowLongPtr(      
    HWND hWnd,
    int nIndex
);

И использование был бы похож (снова, с измененными константами):

LONG_PTR lpUserData = GetWindowLongPtr(hWnd, GWLP_USERDATA);
MyObject* pMyObject = (MyObject*)lpUserData;

10
задан JodaStephen 27 July 2013 в 11:04
поделиться

2 ответа

В этой статье IBM приведены хорошие примеры синтаксической разницы между BGGA и CICE:

Предложение BGGA

BGGA Предложение создает концепцию типов функций, где функция имеет список типизированных аргументов, возвращаемый тип и предложение throws. В предложении BGGA код суммы квадратов будет выглядеть как код в листинге 9:

Листинг 9 . Вычисление суммы квадратов с использованием синтаксиса замыкания BGGA

sumOfSquares = mapReduce(myBigCollection, 
                         { Double x => x * x }, 
                         { Double x, Double y => x + y });

Код внутри фигурных скобок слева от символа => определяет имена и типы аргументов; код справа представляет реализацию определяемой анонимной функции. Этот код может ссылаться на локальные переменные, определенные в блоке, аргументы замыкания или переменные из области, в которой создается замыкание.

В предложении BGGA вы можете объявлять переменные, аргументы метода и возвращаемые значения метода, которые являются типами функций. Вы можете предоставить закрытие в любом контексте, где ожидается экземпляр одного абстрактного класса метода (например, Runnable или Callable); для анонимно типизированных замыканий предоставляется метод invoke (), позволяющий вызывать их с указанным списком аргументов.

Одна из основных целей предложения BGGA - позволить программистам создавать методы, которые действуют как управляющие структуры. Соответственно, BGGA также предлагает некоторый синтаксический сахар, позволяющий вам вызывать методы, которые принимают замыкания, как если бы они были новыми ключевыми словами, чтобы вы могли создавать такие методы, как withLock () или forEach (), и вызывать их, как если бы они были примитивами управления. В листинге 10 показано, как метод withLock () будет определен в рамках предложения BGGA; В листинге 11 и листинге 12 показано, как он будет вызываться с использованием как стандартной формы, так и формы «управляющая конструкция»:

Листинг 10 . Кодирование метода withLock () в соответствии с предложением о закрытии BGGA

public static <T,throws E extends Exception>
T withLock(Lock lock, {=>T throws E} block) throws E {
    lock.lock();
    try {
        return block.invoke();
    } finally {
        lock.unlock();
    }
}

Метод withLock () в листинге 10 принимает блокировку и закрытие. Тип возвращаемого значения и предложение throws закрытия являются универсальными аргументами; Вывод типа в компиляторе обычно позволяет вызывать его без указания значений T и E, как в листинге 11 и листинге 12:

Листинг 11 . Вызов withLock ()

withLock(lock, {=>
    System.out.println("hello");
});

Листинг 12 . Вызов withLock () с использованием сокращенной конструкции элемента управления

withLock(lock) {
    System.out.println("hello");
}

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

Предложение BGGA также работает для исправления ряда ошибок прозрачности, которые присутствуют при попытке использовать экземпляры внутреннего класса для получения преимуществ закрытий. Например, семантика return, break и this в блоке кода отличается от семантики Runnable (или другого экземпляра внутреннего класса), представляющего тот же блок кода. Эти элементы непрозрачности могут вызвать путаницу при переносе кода для использования преимуществ общих алгоритмов.

Предложение CICE

Предложение CICE - это более простое предложение, которое решает проблему, заключающуюся в том, что создание экземпляров внутреннего класса слишком громоздко. Вместо того, чтобы создавать понятие типов функций, он просто создает более компактный синтаксис для создания экземпляров внутреннего класса с помощью одного абстрактного метода (такого как Runnable, Callable или Comparator).

В листинге 13 показано, как код суммы квадратов будет выглядеть в CICE. Он делает явными типы UnaryFunction и BinaryFunction, используемые mapReduce (). Аргументы mapReduce () - это анонимные классы, производные от UnaryFunction и BinaryFunction; синтаксис просто исключает большую часть избыточности, связанной с созданием анонимного экземпляра.

Листинг 13 . Код суммы квадратов согласно предложению CICE о закрытии

Double sumOfSquares = mapReduce(myBigCollection,
    UnaryFunction<Double>(Double x) { return x*x; },
    BinaryFunction<Double, Double>(Double x, Double y) { return x+y; });

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

Он явно указывает типы UnaryFunction и BinaryFunction, используемые mapReduce (). Аргументы mapReduce () - это анонимные классы, производные от UnaryFunction и BinaryFunction; синтаксис просто исключает большую часть избыточности, связанной с созданием анонимного экземпляра.

Листинг 13 . Код суммы квадратов согласно предложению CICE о закрытии

Double sumOfSquares = mapReduce(myBigCollection,
    UnaryFunction<Double>(Double x) { return x*x; },
    BinaryFunction<Double, Double>(Double x, Double y) { return x+y; });

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

Он делает явными типы UnaryFunction и BinaryFunction, используемые mapReduce (). Аргументы mapReduce () - это анонимные классы, производные от UnaryFunction и BinaryFunction; синтаксис просто исключает большую часть избыточности, связанной с созданием анонимного экземпляра.

Листинг 13 . Код суммы квадратов согласно предложению CICE о закрытии

Double sumOfSquares = mapReduce(myBigCollection,
    UnaryFunction<Double>(Double x) { return x*x; },
    BinaryFunction<Double, Double>(Double x, Double y) { return x+y; });

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

Листинг 13 . Код суммы квадратов согласно предложению CICE о закрытии

Double sumOfSquares = mapReduce(myBigCollection,
    UnaryFunction<Double>(Double x) { return x*x; },
    BinaryFunction<Double, Double>(Double x, Double y) { return x+y; });

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

Листинг 13 . Код суммы квадратов согласно предложению CICE о закрытии

Double sumOfSquares = mapReduce(myBigCollection,
    UnaryFunction<Double>(Double x) { return x*x; },
    BinaryFunction<Double, Double>(Double x, Double y) { return x+y; });

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

7
ответ дан 3 December 2019 в 23:13
поделиться

Stephen Colebourne of joda-time fame recently blog a quick summary on the closures proposal.

7
ответ дан 3 December 2019 в 23:13
поделиться
Другие вопросы по тегам:

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