簡體   English   中英

類似Java的代碼(映射,函數指針)

[英]Java-like code (maps, function pointers)

我需要做類似以下代碼的事情:

#include <iostream>
#include <map>

using namespace std;

typedef char (*intfunction)() ;

char a(){
    return 'a';
}

char b(){
    return 'b';
}

int main() {

map<char, intfunction> mapita;

mapita['a'] = &a;
mapita['b'] = &b;

cout << mapita['a']()
     << mapita['b']();

return 0;

}

事實上,我對Java並不十分了解,所以我正在尋找一些幫助。

有沒有可能的方法來模擬或執行與上面的代碼相同的方法? 我看到了一些帶接口等的例子,但是無法以相同的方式工作。

看看這段代碼:

import java.util.HashMap;
import java.util.Map;

public class test2 {
    interface Test {
        public String method();
    }

    public static void main(final String[] arg) {
        final Map<String, Test> map = new HashMap<String, Test>();

        map.put("a", new Test() {
            @Override
            public String method() {
                return "aaa";
            }
        });
        map.put("b", new Test() {
            @Override
            public String method() {
                return "bbb";
            }
        });

        System.out.println(map.get("a").method());
        System.out.println(map.get("b").method());
    }
}

我能想到的唯一真正的潛在解決方案是可運行對象的映射:

public void doSomething() {...}

//elsewheres
Map<String, Runnable> map = new HashMap<>();
//Java 7
map.put("test", new Runnable() { doSomething(); });
//Java 8
map.put("test", () -> { doSomething(); });

要么是這個,要么是為對象實現公共接口的類(如果需要一些返回值)。

語法可能有點偏,但是

import java.utils.HashMap;


class CharHolder {
    private char myChar;

    CharHolder( char someChar ) {
        myChar = someChar;
    }

    char getChar() {
        return myChar;
    }

    public static void main(String[] args) {
        HashMap<Character, CharHolder> mapita = new HashMap<>();
        mapita.put( 'a', new CharHolder('a') );
        mapita.put( 'b', new CharHolder('b') );
        System.out.println( mapita.get('a').getChar() + " " + mapita.get('b').getChar() );
    }
}

輸出應為:ab

我想使用OOP解決方案來實現您想要的行為。

理念

正如您的代碼所示,您希望調用不同的方法來調用不同的密鑰。 這個場景完全匹配工廠設計模式 ,所以我創建了一個工廠,根據傳入的密鑰返回方法實例。然后我將函數抽象到接口BaseMethod 然后,您可以創建實現接口的類,以便在業務增長時實現相同的方法簽名。

需要改進

  1. 工廠不是線程安全的。
  2. 接口,類需要在多個文件中。

import java.util.HashMap;
import java.util.Map;


interface BaseMethod {
  public void run();
}

class HelloWoldMethod implements BaseMethod {
  public void run() {
    System.out.println("Hello world");
  }

}

class MethodFactory {
  private static MethodFactory ins = null;
  private final static Map<String, BaseMethod> map = new HashMap<String, BaseMethod>();

  private MethodFactory() {
    map.put("hello", new HelloWoldMethod());
  }

  public static BaseMethod getMethod(String key) {
    if (null == ins) {
      ins = new MethodFactory();
    }
    return map.get(key);
  }
}


public class Test {

  public static void main(String [] args) {
    BaseMethod ins = MethodFactory.getMethod("hello");
    if (null != ins) {
      ins.run();

    } else {
      System.out.println("no method found");

    }
  }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM