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

Java 如何根据用户输入设置静态最终变量?,java,static,initialization,final,Java,Static,Initialization,Final,我试图用人工智能来模拟经典的水壶问题。我制作了一个类JugsState,用于存储两个水罐的当前状态,即,jug1中有多少升水,jug2中有多少升水。此外,我希望存储每个水罐可以容纳的最大水量,我将从用户那里获取作为输入。因为这两个罐子的容量始终是恒定的,所以我将它们声明为静态最终变量。但是我无法在构造函数中初始化它们。是否还有其他替代方法,可以在类JugsState中维护max_jug变量的封装 class JugsState { private static final int max

我试图用人工智能来模拟经典的水壶问题。我制作了一个类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

如果您的类表示一个jug,则它不应包含有关两个jug的信息。 maxAmount或volume应该是类的非静态成员:

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

如果您的类代表一个罐子,那么它不应该包含关于两个罐子的信息。 maxAmount或volume应该是类的非静态成员:

public class Jug {
    public final double volume;
    private double currentAmount = 0;
    public Jug(double vol) { volume = vol; }
    ...
}
不能更改最终变量,因为它是最终变量。但是,在声明它时,可以将其设置为任何您想要的值。您可以创建一个静态函数来获取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;
这将在程序运行的剩余时间内设置这些变量。

不能更改最终变量,因为它是最终变量。但是,在声明它时,可以将其设置为任何您想要的值。您可以创建一个静态函数来获取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;
这将在程序运行的剩余时间内设置这些变量。

如果变量是静态的,那么每次调用构造函数时都会重新初始化它。如果是最终设置,则只能设置一次。 类似于您所描述的内容可能是以下内容,请注意静态方法setMaxJug1

然后你就可以打电话了

 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_jug1和max_jug2通常具有不同的值,具体取决于在构造函数中传递的值a1和a2

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

如果变量是静态的,那么每次调用构造函数时都会重新初始化它。如果是最终设置,则只能设置一次。 类似于您所描述的内容可能是以下内容,请注意静态方法setMaxJug1

然后你就可以打电话了

 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_jug1和max_jug2通常具有不同的值,具体取决于在构造函数中传递的值a1和a2


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

如果用户可以设置它,它不是一个常量。@我希望用户只设置一次。然后删除静态关键字并保留最后一个关键字。然后只允许输入一次。@Tom但这不会使max_jug1和max_jug2对类的每个实例都有副本吗?该类表示jugs的当前状态。如果用户可以设置它,它就不是一个常量。@TheGuy,我希望用户只设置一次。然后删除静态关键字并保留最后一个关键字。然后只允许输入一次。@Tom但这不会使max_jug1和max_jug2复制该类的每个实例吗?这个类代表罐子的当前状态。非常正确。但是,假设有两个罐子:Amax 6和Bmax 4。在一种状态下,它们有1,2个卷,而在另一种状态下,它们有2,3个卷。如何存储状态中包含的信息?请注意currentAmount变量?假设一个罐子有n个状态,那么关于最大容量的信息会重复n次。我希望它只存储一次,以防止差异和消除冗余。您不需要保留所有状态。现在的状态就足够了。如果您确实希望保存给定罐子状态的历史,请将其设置为罐子内的数组。这里最重要的是不要把一个物体和它的状态,以及它的属性混淆起来,它们是三个不同的东西。不,在水壶之间传递水的逻辑不属于水壶。它应该在外部方法中,如main或其他任何地方:jug2.addjug1.removeMath.minjug1.curAmount、jug2.max-jug2.curAmount;或者,也许,只是2罐。

addAllFromjug1;如果它经常被使用,有一定的实用价值,那就对了。但是,假设有两个罐子:Amax 6和Bmax 4。在一种状态下,它们有1,2个卷,而在另一种状态下,它们有2,3个卷。如何存储状态中包含的信息?请注意currentAmount变量?假设一个罐子有n个状态,那么关于最大容量的信息会重复n次。我希望它只存储一次,以防止差异和消除冗余。您不需要保留所有状态。现在的状态就足够了。如果您确实希望保存给定罐子状态的历史,请将其设置为罐子内的数组。这里最重要的是不要把一个物体和它的状态,以及它的属性混淆起来,它们是三个不同的东西。不,在水壶之间传递水的逻辑不属于水壶。它应该在外部方法中,如main或其他任何地方:jug2.addjug1.removeMath.minjug1.curAmount、jug2.max-jug2.curAmount;或者,也许,只是jug2.addAllFromjug1;如果它经常被使用,成为一个实用工具。我应该如何声明getMax?@user3526682它应该是一个静态函数,返回用户对最大值的选择。你能用一个例子详细说明一下吗?那将非常有帮助。thankshow我应该声明getMax吗?@user3526682它应该是一个静态函数,返回用户对最大值的选择。你能用一个例子详细说明一下吗?那将非常有帮助。感谢如果变量是静态的,那么它不能在构造函数中设置,因为它不仅仅属于正在构造的对象。这肯定不是真的。我应该在哪里声明setMaxJug1?我对java没有太多经验,什么时候应该调用它?静态方法可以设置在类jug中的任何位置,显然在任何其他方法之外,也在构造函数之外。我编辑代码以显示一个示例。如何根据用户输入将值传递给setMaxJug1?在主要功能中?@GioPan,它可能没有那么明确,但仍然是错误的。在构造函数中设置静态变量没有什么错,并且有许多可能有用的用例示例。这不是其中之一,但不是因为您不应该在构造函数中设置静态变量,而是因为这些特定变量不应该是静态的。如果变量是静态的,那么它就不能在构造函数中设置,因为它不仅属于正在构造的对象。这肯定不是真的。我应该在哪里声明setMaxJug1?我对java没有太多经验,什么时候应该调用它?静态方法可以设置在类jug中的任何位置,显然在任何其他方法之外,也在构造函数之外。我编辑代码以显示一个示例。如何根据用户输入将值传递给setMaxJug1?在主要功能中?@GioPan,它可能没有那么明确,但仍然是错误的。在构造函数中设置静态变量没有什么错,并且有许多可能有用的用例示例。这不是其中之一,不是因为您不应该在构造函数中设置静态变量,而是因为这些特定变量不应该是静态的。