我应该如何根据用户输入设置静态最终变量?
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 表示一个水罐,它不应包含有关 两个 个水罐的信息。
maxAmount
或 volume
应该是 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_jug1
和 max_jug2
值,具体取决于您在构造函数中传递的值 (a1,a2
)。
正确的选择取决于您希望如何使用水罐对象。
我正在尝试在 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 表示一个水罐,它不应包含有关 两个 个水罐的信息。
maxAmount
或 volume
应该是 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_jug1
和 max_jug2
值,具体取决于您在构造函数中传递的值 (a1,a2
)。
正确的选择取决于您希望如何使用水罐对象。