Существует много вариантов использования указателей.
Полиморфное поведение. Для полиморфных типов указатели (или ссылки) используются для предотвращения нарезки:
class Base { ... };
class Derived : public Base { ... };
void fun(Base b) { ... }
void gun(Base* b) { ... }
void hun(Base& b) { ... }
Derived d;
fun(d); // oops, all Derived parts silently "sliced" off
gun(&d); // OK, a Derived object IS-A Base object
hun(d); // also OK, reference also doesn't slice
Ссылочная семантика и избежание копирования. Для неполиморфных типов указатель (или ссылка) избежит копирования потенциально дорогого объекта
Base b;
fun(b); // copies b, potentially expensive
gun(&b); // takes a pointer to b, no copying
hun(b); // regular syntax, behaves as a pointer
. Обратите внимание, что C ++ 11 имеет семантику перемещения, которая может избежать многих копий дорогостоящих объектов в аргумент функции и как возвращаемые значения. Но использование указателя, безусловно, позволит избежать этого и позволит использовать несколько указателей на одном и том же объекте (тогда как объект может перемещаться только один раз).
Получение ресурсов. Создание указателя на ресурс с помощью оператора new
является анти-шаблоном в современном C ++. Используйте специальный класс ресурсов (один из стандартных контейнеров) или интеллектуальный указатель (std::unique_ptr<>
или std::shared_ptr<>
). Рассмотрим:
{
auto b = new Base;
... // oops, if an exception is thrown, destructor not called!
delete b;
}
vs.
{
auto b = std::make_unique ();
... // OK, now exception safe
}
Необработанный указатель должен использоваться только как «вид» и никоим образом не связан с владением, будь то прямое создание или неявно через возвращаемые значения. См. Также этот Q & amp; A из C ++ FAQ .
Более мелкозернистый контроль времени жизни Каждый раз, когда копируется общий указатель (например, как аргумент функции), ресурс это указывает на то, что он остается в живых. Обычные объекты (не созданные new
, либо непосредственно вами, либо внутри класса ресурсов) уничтожаются при выходе из области видимости.
Зарегистрированный objectMapper должен использоваться с параметром ACCEPT_SINGLE_VALUE_AS_ARRAY .
Возможно, самый простой способ добиться этого - зарегистрировать правильно инициализированные ObjectMapper
и MappingJacksonHttpMessageConverter
в классе аннотируется с помощью @Configuration
:
@Bean
public ObjectMapper getObjectMapper() {
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.enable(ACCEPT_SINGLE_VALUE_AS_ARRAY);
return objectMapper;
}
@Bean
public MappingJacksonHttpMessageConverter mappingJacksonHttpMessageConverter(ObjectMapper objectMapper) {
MappingJacksonHttpMessageConverter converter = new MappingJacksonHttpMessageConverter();
converter.setObjectMapper(objectMapper);
return converter;
}
Другой способ - установить преобразователь непосредственно на объект restTemplate:
public ObjectMapper objectMapper() {
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.enable(ACCEPT_SINGLE_VALUE_AS_ARRAY);
return objectMapper;
}
public MappingJackson2HttpMessageConverter httpConverter(ObjectMapper objectMapper) {
return new MappingJackson2HttpMessageConverter(objectMapper);
}
public void restTemplate() {
RestTemplate restTemplate = new RestTemplate();
restTemplate.setMessageConverters(Arrays.asList(httpConverter(objectMapper())));
restTemplate.exchange(...);
}
JSON - это обозначение объекта javascript. JSON - это тот же синтаксис, что и javascript. В JSON значения массива должны быть типа string, array, number, object boolean или null.