我应该如何根据用户输入设置静态最终变量?

时间:2015-01-10 13:44:36

标签: java static initialization final

我试图在AI中模拟经典的水壶问题。我制作了一个“JugsState”类,它存储了两个水壶的当前状态,即jug1中有多少升水和jug2中有多少升水。另外,我想存储每个水罐可容纳的最大水量,我将从用户那里作为输入。由于这(两个水罐的容量)将始终保持不变,我将它们声明为静态最终变量。但是我无法在构造函数中初始化它们。还有其他替代方法,它维护了类JugsState中max_jug变量的封装吗?

class JugsState
{
    private static final int max_jug1,max_jug2;
    private int jug1,jug2; //stores the current amount of water in the jugs.

    JugsState(int a1,int a2)
    {
        max_jug1 = a1;
        max_jug2 = a2;
    }
}

错误:“无法为最终变量max_jug1赋值” 错误:“无法为最终变量max_jug2赋值”

3 个答案:

答案 0 :(得分:2)

如果您的班级代表一个水壶,它不应该包含两个水壶的信息。 maxAmountvolume应该是该类的非静态成员:

public class Jug {
    public final double volume;
    private double currentAmount = 0;
    public Jug(double vol) { volume = vol; }
    ...
}

答案 1 :(得分:1)

您无法更改final变量,因为它是final。但是,可以将其设置为声明时所需的任何内容。您可以创建一个获取jar最大值的静态函数。它可能是这样的,如果你想从System.in得到它:

private static int getMax(){
    System.out.println("Enter the maximum for a jar:");
    Scanner in=new Scanner(System.in);
    return in.nextInt();
}

然后使用

private static final int max_jug1=getMax();
private static final int max_jug2=getMax();

取代

private static final int max_jug1, max_jug2;

这将在程序运行的剩余时间内设置这些变量。

答案 2 :(得分:0)

如果变量是static,那么每次调用构造函数时都会重新初始化它。如果是final,则只能设置一次。 接近你所描述的内容可能如下(请注意静态方法setMaxJug1

   class jug
    {
        private static int max_jug1,max_jug2;
        private int jug1,jug2; //stores the current amount of water in the jugs.
        jug(){
          // Your constructor stuff
        }
        public static void setMaxJug1(int m){
           max_jug1 = m;
        }
    }

然后在主要部分你可以打电话

 jug.setMaxJug1(m);

可能还有其他方法可以满足您的要求,但我尝试不要更改过多的代码。

简而言之,一种替代方法是让这些变量不是静态的,如:

class jug
        {
            private final int max_jug1,max_jug2;
            private int jug1,jug2; //stores the current amount of water in the jugs.
            jug(int a1,int a2)
             {
               max_jug1 = a1;
               max_jug2 = a2;
             }   
        }

然后你可以使用原始的构造函数。但是,每个jug对象(通常)都会有max_jug1max_jug2的不同值,具体取决于您在构造函数中传递的值(a1,a2)。

正确的选择取决于你想如何使用jug对象。