我需要一种随机化结果传递和持有类的方法

时间:2016-10-12 18:40:12

标签: java random-access

我试图添加让我们说5个类,它们都扩展了一个General类,并以不同的方式实现init()方法。 我需要的是一种存储这些类的方法,同时将该类的一些机会传递给"发生"

为此,我创建了一个类持有者:

public class ClassHolder {

    private Class<? extends GeneralOutcome> holdClass;
    private int chances;

    public ClassHolder(Class<? extends GeneralOutcome> holdClass, int chances) {
        super();
        this.holdClass = holdClass;
        this.chances = chances;
    }

    public Class<? extends GeneralOutcome> getHoldClass() {
        return holdClass;
    }
    public void setHoldClass(Class<? extends GeneralOutcome> holdClass) {
        this.holdClass = holdClass;
    }
    public int getChances() {
        return chances;
    }
    public void setChances(int chances) {
        this.chances = chances;
    }
}

还有一个GeneralOutcome类,它将添加到列表中的那些类:

public class GeneralOutcome {

    public void init(String text, int times) {

    }
}

以及我将它们添加到列表中的方式:

public class Randomizer {

    private static List<ClassHolder> myList = new ArrayList<ClassHolder>();

    private static ClassHolder outcome01 = new ClassHolder(Outcome01.class, 10);
    private static ClassHolder outcome02 = new ClassHolder(Outcome02.class, 10);
    private static ClassHolder outcome03 = new ClassHolder(Outcome03.class, 10);
    private static ClassHolder outcome04 = new ClassHolder(Outcome04.class, 10);
    private static ClassHolder outcome05 = new ClassHolder(Outcome05.class, 10);


    public static void main(String[] args) {

        for(int i = 0; i < outcome01.getChances(); i++) {
            myList.add(outcome01);
        }
        for(int i = 0; i < outcome02.getChances(); i++) {
            myList.add(outcome02);
        }
        for(int i = 0; i < outcome03.getChances(); i++) {
            myList.add(outcome03);
        }
        for(int i = 0; i < outcome04.getChances(); i++) {
            myList.add(outcome04);
        }
        for(int i = 0; i < outcome05.getChances(); i++) {
            myList.add(outcome05);
        }

        System.out.println(myList.size());

        int rand = (int) (Math.random() * myList.size());

        System.out.println(rand);

        ClassHolder theHoldClass = myList.get(rand);

        System.out.println(theHoldClass.getHoldClass());

        Class<? extends GeneralOutcome> theOutcome = theHoldClass.getHoldClass();

        theOutcome.init();

    }
}

问题在于我无法(不知道真的如何)回到GeneralOutcome我可以访问.init()方法。 我得到方法init()未定义类型Class<capture#3-of ? extends GeneralOutcome>

我知道这不是最好的方法。所以我对两者都持开放态度,这是对此的解决方法,也是实现这一目标的更好方法。

1 个答案:

答案 0 :(得分:2)

由于某些原因,您在这里尝试做的事情并不起作用。

首先,你的init方法不是静态的。那个电话

Class<? extends GeneralOutcome> theOutcome = theHoldClass.getHoldClass();
theOutcome.init();

直接导致编译时错误。

但是,整个设计看起来很奇怪。首先持有 Class 对象有什么意义?

为什么不创建界面

public interface OutcomeFunctionality {
   public void foo(String text, int times);
}

以后实例化实现该接口的任何类的对象?这样你最终可以处理这些对象的列表(以及这些概率)?

[我故意使用名称​​ foo :单独使用奇怪的名字&#34; init&#34;让你很清楚你的代码打算做什么!从这个意义上说,你应该重新思考你的设计,并找到更好的方法名称来表达这些方法将要做的事情! ]

长话短说:使用/持有对象并不能在示例代码中为您购买任何内容 - 它只会增加复杂性。所以我的建议是:开始在那里工作并摆脱那个&绕组&#34;。您可能还想阅读Open/Closed principle - 这可以为您提供一些指导如何使用抽象类/子类化来分割&#34;行为&#34;在基类和派生类之间。