如何映射界面接口调用getValue()/getKey()方法而无需创建对象



这是场景:

Set<Map.Entry<String,Integer>> st=hashMap.entrySet();
for(Map.Entry<String,Integer> me : set)
{
  System.out.println(me.getKey()+":"+me.getValue());
}

现在,我的问题是设置,映射,条目所有是接口和getKey((和getValue((是输入接口中的方法。

将我的commet扩展到答案:

基本思想是公开接口隐藏实现。通常,方法返回类型是接口,并且从方法的侧面返回隐藏实现。这使该代码(LIB(的用户与实现相关。实施类可以改变而不会受到影响。

现在您对

的查询
Set<String,Integer> st=hashMap.entrySet();

Hashmap源代码具有实现设置的内部类。Hashmap中存在方法entrySet((,它返回实现Set set 的该类的对象。签名中的返回类型是设置的,而不是实现类的,但它是实现返回的集合接口的混凝土类的对象。

以这种方式,hashmap.java的作者已将实现隐藏在您身上。他们可以在新版本的Java中更改实施类。只有他们需要注意他们的新实施类设置界面。

它类似于下面的代码。

public interface InterfaceExposed{
      public void task();
} 
public class A{
     private class Implementation implements InterfaceExposed{
       public void task(){
             // some code to do task as per current implementation.
       }
     }
     public IExposedInterfaceOfA similarToEntrySet(){
          return new Implementation();
    }
} 

现在,A类的用户将取决于暴露的接口,并且不会知道并且不依赖隐藏的私有实现。

 A a = new A();
 IExposedInterfaceOfA xyz =    a.similarToEntrySet();
 xyz.task();

在这里,您将XYZ视为类型为I Exposedinterfaceofa,但它是指混凝土类实现的对象。

HashMap具有所有这些接口的内部实现。

例如,有一个EntrySet类,该类用作entrySet()方法返回的Set的实现:

public Set<Map.Entry<K,V>> entrySet() {
    Set<Map.Entry<K,V>> es;
    return (es = entrySet) == null ? (entrySet = new EntrySet()) : es;
}

,有几个类是Map.Entry的实现。

例如:

static class Node<K,V> implements Map.Entry<K,V>

SetEntry对象是在Hashmap类内部创建的。如果您看到java.util.Hashmap的源代码并访问entrySet()方法,则会看到它创建一个具体的EntrySet(该类别扩展了AbstractSet类,又为您使用Set接口(。您将这个对象称为Set。同样,Hashmap提供了Entry类的内部实现,其中之一是Node,您会再次找到源代码。我强烈建议您访问源代码。

正如Linus Torvalds所说,

谈话很便宜,告诉我代码

class coptosion insalitance。

entrySet方法的定义返回一个嵌套类EntrySet的对象。

EntrySet是一种实现Map.Entry接口的具体类。

Entry也是实现Map.Entry接口的具体类。 Entry类定义getKeygetValue方法。

EntrySetEntry是在hashmap类中组成的类。因此,当您实例化HashMap的对象时,您可以使用这些方法。

Hashmap源代码

相关内容

最新更新