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

How should I set a static final variable based on user input?

我正在尝试在 AI 中模拟 classic 水壶问题。我做了一个 class "JugsState" 来存储两个水壶的当前状态,即 jug1 中有多少升水,jug2 中有多少升水。此外,我想存储每个水壶可以容纳的最大水量,我将从用户那里获取该值作为输入。由于这个(两个水罐的容量)始终保持不变,因此我将它们声明为静态最终变量。但是我无法在构造函数中初始化它们。有没有其他替代方法,它可以在 class 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;
    }
}

错误:"cannot assign a value to final variable max_jug1" 错误:"cannot assign a value to final variable max_jug2"

如果您的 class 表示一个水罐,它不应包含有关 两个 个水罐的信息。 maxAmountvolume 应该是 class:

的非静态成员
public class Jug {
    public final double volume;
    private double currentAmount = 0;
    public Jug(double vol) { volume = vol; }
    ...
}

您无法更改 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;

这将为程序运行的其余时间设置这些变量。

如果一个变量是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)。

正确的选择取决于您希望如何使用水罐对象。