【问题标题】:Java - Access a class method with a dynamic name variantJava - 访问具有动态名称变体的类方法
【发布时间】:2016-02-17 15:45:20
【问题描述】:

我有这个问题有一段时间了,直到现在才设法避免它。基本上,我有一个类存储高尔夫球场每个洞的信息,并带有一个返回该信息的吸气剂。在另一个类中,当用户从洞 1 移动到洞 2(当前存储为整数)时,我希望访问洞 2 的 getter 方法,但无法弄清楚如何做到这一点。

代码:

课程信息类:

//Hole information
private static String[] hole1 = {"name", "Distance", "Par"};
private static String[] hole2 = {"name", "Distance", "Par"};

public static String[] getHole1(){
    return hole1;
}

public static String[] getHole2(){
    return hole2;
}

主类:

String[] holeInfo;
int currentHole = 1;

//How I call hole1 info just now
//I just access the elements of the array as needed then
holeCoOrds = course.getHole1();

//User starts next hole (this will be the case for all 18 holes)
currentHole++ 

//Call next hole information getter method here
//Something along the lines of;
holeCoOrds = course.getHole(currentHole)();

任何帮助将不胜感激,我已经绞尽脑汁一段时间了,但没有成功。

提前致谢。

【问题讨论】:

    标签: java class dynamic-programming static-methods


    【解决方案1】:

    你没有最好的方法:

    //Hole information
    private static String[] hole1 = {"name", "Distance", "Par"};
    private static String[] hole2 = {"name", "Distance", "Par"};
    

    可以这样存储在List<String[]>中:

    private static List<String[]> holes = new ArrayList<String[]>();
    
    private static String[] hole1 = {"name", "Distance", "Par"};
    holes.add(hole1);
    private static String[] hole2 = {"name", "Distance", "Par"};
    holes.add(hole2);
    

    然后,只用一种方法获取孔值:

    public static String[] getHole(int holeNumber){
        return holes.get(holeNumber);
    }
    

    如果您想更好地控制孔洞,请使用Map 添加一个key 来标识每个孔洞value

    private static Map<Integer, String[]> holes = new HashMap<Integer, String[]>();
    
    private static String[] hole1 = {"name", "Distance", "Par"};
    holes.put(1, hole1);
    private static String[] hole2 = {"name", "Distance", "Par"};
    holes.put(2, hole2);
    

    然后,只用一种方法获取孔值:

    public static String[] getHole(int holeNumber){
        return holes.get(holeNumber);
    }
    

    【讨论】:

      【解决方案2】:

      您可以通过反射来做到这一点。然而,更好的方法是重新设计你的类,这样就没有必要了。将所有 hole 数组放入另一个数组或列表中,然后创建一个 getHole(int) 方法,该方法从中返回一个项目。

      所以一个简单(没有完整性检查)的版本应该是这样的:

      private static String[] holes = {{"name", "Distance", "Par"},
                                       {"name", "Distance", "Par"}};
      
      public static String[] getHole(int hole){
          return holes[hole];
      }
      

      这使得将来添加额外的漏洞变得容易,并且让您的代码更加灵活,因此您无需在编译时知道您想要哪个漏洞。

      【讨论】:

      • 我不敢相信我没有想到这一点,等待期后将设置为接受的答案。再次感谢:)
      【解决方案3】:

      为什么不为Hole 实体创建一个类,如下所示:

      public class Hole {
       private int holeNo;
       private String name;
       private String dist;
       private String par;
      
       //getters and setters for above properties
      }
      

      这样当您从主类调用代码时,很容易遍历一组孔(2 个或更多)。

      您甚至可以将 Hole 对象的所有实例保存在 Map 中,以便轻松检索。

      【讨论】:

        猜你喜欢
        • 2015-05-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-08-10
        • 2012-11-22
        • 1970-01-01
        • 2018-02-11
        • 2015-08-10
        相关资源
        最近更新 更多