这有什么特点?

时间:2016-09-05 20:05:27

标签: java anonymous-class

我无法理解以下代码段:

Unirest.setObjectMapper(new ObjectMapper() {
    private com.fasterxml.jackson.databind.ObjectMapper jacksonObjectMapper
            = new com.fasterxml.jackson.databind.ObjectMapper();

    public <T> T readValue(String value, Class<T> valueType) {
        try {
            return jacksonObjectMapper.readValue(value, valueType);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    public String writeValue(Object value) {
        try {
            return jacksonObjectMapper.writeValueAsString(value);
        } catch (JsonProcessingException e) {
            throw new RuntimeException(e);
        }
    }
});

ObjectMapper是一个接口,为什么我可以用new关键字来定义?它看起来像java 8功能,对吧?

2 个答案:

答案 0 :(得分:2)

这是Java中非常常见的做法,您所看到的称为匿名类。相同的代码可以替换为:

private class ObjectMapperChild extends ObjectMapper
{
private com.fasterxml.jackson.databind.ObjectMapper jacksonObjectMapper
            = new com.fasterxml.jackson.databind.ObjectMapper();

    public <T> T readValue(String value, Class<T> valueType) {
        try {
            return jacksonObjectMapper.readValue(value, valueType);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    public String writeValue(Object value) {
        try {
            return jacksonObjectMapper.writeValueAsString(value);
        } catch (JsonProcessingException e) {
            throw new RuntimeException(e);
        }
    }
}

ObjectmapperChild objMapperChild = new ObjectMapperChild();
Unirest.setObjectMapper(objMapperChild);

答案 1 :(得分:1)

这是一个匿名课程。例如,如果您不想创建带有声明的新类文​​件,因为您只在代码的那个位置使用此类,那么您可以这样做。

在Java 1.8中引入了Functional接口(只有一个方法的接口),您可以使用Lambda表达式声明这样的匿名类。例如,当您要过滤列表时:

(Person p) -> p.getGender() == Person.Sex.MALE

相同
 new CheckPerson() {
     public boolean test(Person p) {
         return p.getGender() == Person.Sex.MALE;
     }
 }

interface CheckPerson {
    boolean test(Person p);
}

您可以在此处找到有关lambdas的更多信息 - https://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html