2016-09-05 6 views
-3

私は次のコードスニペットを理解することができませんでした:どのような機能ですか?

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がインタフェースで、どのようにあるように、私は新しいキーワードを定義することができます来ますか?それは右のJava 8の機能のように見えますか?

+7

これはJava 1.1の機能です。匿名クラス。 –

+0

ああ、どうもありがとう。 –

+0

ObjectMapperを少し調べました。それはそのクラスのインターフェースではありません。それに応じて私の答えを変更しました。匿名のクラスの概念はまだ成り立っています。 – nitinsh99

答えて

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では、機能的なインターフェイス(1つのメソッドのみのインターフェイス)を導入して、ラムダ式を使用してそのような匿名クラスを宣言することができます。あなたがリストをフィルタリングしたい場合たとえば: - https://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html

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

はあなたがここにもっとに関するラムダを見つけることができたときに

interface CheckPerson { 
    boolean test(Person p); 
} 

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

と同じです。

関連する問題