JavaにはReflectionというものがあり、文字列からクラスやメソッドなどを生成したり呼び出したりできます。
この機能を使えば、やりたいことが得られると思います。
また、今回の求める内容に関してはデザインパターンと呼ばれるJavaの定石を集めたものがあるのですがその中の FactoryMethodと呼ばれるものが当てはまると思います。
下記の createMapの部分がFactoryにあたる部分でここで入力された文字列から該当のクラスの生成をしています。また作られたMapのインスタンスを同じものとしてみなす必要があるのでインターフェースの実装(TownMap とか)に抽象クラス(AbstractMap)を間に挟んでいます。
デザインパターンの例では、本来はFactoryの部分は別クラスにすることになっていますが今回の実例に合わせてMapInfoのメソッドとして実装しました。
デザインパターンは、今回のファクトリメソッドパターン以外にもありますので、興味があれば見てみると良いと思います。
【参照】
TECHSCORE デザインパターン
【Java入門】リフレクションでメソッドの実行、フィールドの変更
java
1public class MapInfo {
2 public static AbstractMap createMap(String mapName) {
3 String packageName = MapInfo.class.getName();
4 try {
5 Class<?> mapClass = (Class<?>) Class.forName(packageName + "$" + mapName);
6 Object mapInstance = mapClass.newInstance();
7 return (AbstractMap) mapInstance;
8 } catch (ClassNotFoundException | InstantiationException | IllegalAccessException e) {
9 e.printStackTrace();
10 }
11 return null;
12
13 }
14 public static class AbstractMap implements View.OnClickListener {
15 @Override
16 public void onClick(View view) {
17 }
18 }
19 public static class TownMap extends AbstractMap{
20 @Override
21 public void onClick(View view){
22 System.out.println("ここは町です");
23 }
24 }
25
26 public static class BossMap extends AbstractMap{
27 public void onClick(View view) {
28 System.out.println("ここはボス部屋です");
29 }
30 }
31
32 public static class InnMap extends AbstractMap{
33 public void onClick(View view){
34 System.out.println("ここは宿です");
35 }
36 }
37
38 public static class DungeonMap extends AbstractMap{
39 public void onClick(View view) {
40 System.out.println("ここはダンジョンです");
41 }
42 }
43}
呼び出す側の createMapに渡す引数は文字列なのでメインの処理側で文字列作ってあげればよいです。
java
1AbstractMap townMap = MapInfo.createMap("TownMap");
2townMap.onClick(null);
3
4AbstractMap bossMap = MapInfo.createMap("BossMap");
5bossMap.onClick(null);
6
7AbstractMap innMap = MapInfo.createMap("InnMap");
8innMap.onClick(null);
9
10AbstractMap dungeonMap = MapInfo.createMap("DungeonMap");
11dungeonMap.onClick(null);
12