Java 将记住其值的计数器
我有一项任务要处理复数。每个数字由双r=实部、双i=虚部和字符串名组成。名称必须在构造函数中设置,所以我创建了int counter,然后将其值发送到setNextName函数并返回名称字母。不幸的是,增加这个“计数器”值只在costructor中起作用,然后它再次被设置为0。怎么处理?一些常量值?第二个问题是,我还需要提供setNextNames(char c)函数来更改计数器的当前值 守则:Java 将记住其值的计数器,java,constants,Java,Constants,我有一项任务要处理复数。每个数字由双r=实部、双i=虚部和字符串名组成。名称必须在构造函数中设置,所以我创建了int counter,然后将其值发送到setNextName函数并返回名称字母。不幸的是,增加这个“计数器”值只在costructor中起作用,然后它再次被设置为0。怎么处理?一些常量值?第二个问题是,我还需要提供setNextNames(char c)函数来更改计数器的当前值 守则: public class Imaginary { private double re; priva
public class Imaginary {
private double re;
private double im;
private String real;
private String imaginary;
private String name;
private int counter=0;
public Imaginary(double r, double u){
re = r;
im = u;
name = this.setNextName(counter);
counter++;
}
public static String setNextName(int c){
String nameTab[] = {"A","B","C","D","E","F","G","H","I","J","K","L","M","N",
"O","P","Q","R","S","T","U","W","V","X","Y","Z"};
String setName = nameTab[c];
System.out.println("c: "+c);
return setName;
}
public static String setNextName(char c){
//
//don't know how to deal with this part
//
}
很难说你在做什么,但我怀疑这会解决你眼前的问题:
private static int counter = 0;
很难说你在做什么,但我怀疑这会解决你眼前的问题:
private static int counter = 0;
您应该使
计数器
为静态
您还应该使
nameTab
成为一个私有静态字段,然后在setNextName()
中,您可以遍历它以找到与给定字符对应的名称,并获取其索引。(在普通的ASCII世界中,当然可以简单地通过从给定字符中减去“A”的数值来计算索引,但我不太确定在Unicode中使用Java时,如何使用疯狂的输入-迭代是安全的。)您应该将计数器设置为静态的
您还应该使nameTab
成为一个私有静态字段,然后在setNextName()
中,您可以遍历它以找到与给定字符对应的名称,并获取其索引。(在普通的ASCII世界中,当然可以简单地通过从给定字符中减去“A”的数值来计算索引,但我不太确定在Unicode中使用Java时,如何使用疯狂的输入-迭代是安全的。)因为字段计数器
不是静态的,每个对象都有自己的计数器。因为字段计数器
不是静态的
,所以每个对象都有自己的计数器。在OO语言中,一个类中通常有两种类型的变量:
- 每个实例唯一的实例变量
- 类的所有实例共享的类变量
给定一个类,如:
public class Person
{
// class variable
private static int numberOfEyes;
// instance variable
private String name;
// other code goes here
}
如果您要执行以下操作:
Person a = new Person("Jane Doe");
Person b = new Person("John Doe");
a.setName("Jane Foe");
然后做一些类似的事情:
Person a = new Person("Jane Doe");
Person b = new Person("John Doe");
a.setName("Jane Foe");
人员“a”的名称将更改,但人员“b”的名称将保持不变
如果你有一天早上醒来,决定要3只眼睛:
Person.setNumberOfEyes(3);
然后,人“a”和人“b”以及其他每个人的实例都会突然有3只眼睛
您希望在计数器声明中添加“static”。在OO语言中,一个类中通常有两种类型的变量:
- 每个实例唯一的实例变量
- 类的所有实例共享的类变量
给定一个类,如:
public class Person
{
// class variable
private static int numberOfEyes;
// instance variable
private String name;
// other code goes here
}
如果您要执行以下操作:
Person a = new Person("Jane Doe");
Person b = new Person("John Doe");
a.setName("Jane Foe");
然后做一些类似的事情:
Person a = new Person("Jane Doe");
Person b = new Person("John Doe");
a.setName("Jane Foe");
人员“a”的名称将更改,但人员“b”的名称将保持不变
如果你有一天早上醒来,决定要3只眼睛:
Person.setNumberOfEyes(3);
然后,人“a”和人“b”以及其他每个人的实例都会突然有3只眼睛
您想在计数器声明中添加“static”。您的代码是否被多个线程使用,而我认为使用计数器static并不能解决您的问题
您需要格外小心,如下图所示,使用lock关键字实现线程同步
private static readonly obj = new Object();
private static int counter =0;
public Imaginary(double r, double u)
{
re = r;
im = u;
lock(obj)
{
name = this.setNextName(counter);
counter++;
}
}
这将在增加计数器的同时确保线程安全(还有其他方法可以提供线程安全性,但这一种的代码最少)。您的代码是否被多个线程使用,而不是我所建议的使计数器静态不会解决您的问题
您需要格外小心,如下图所示,使用lock关键字实现线程同步
private static readonly obj = new Object();
private static int counter =0;
public Imaginary(double r, double u)
{
re = r;
im = u;
lock(obj)
{
name = this.setNextName(counter);
counter++;
}
}
这将在增加计数器的同时确保线程安全(还有其他方法可以提供线程安全性,但这一种的代码最少)。@owca:你为什么要生活在这样一个有限的世界里?!无论哪种语言有多好,我都不会只想要一种语言。或者冰淇淋的味道。或音乐风格。或者……或者……或者……;-)@你为什么要生活在这样一个有限的宇宙里?!无论哪种语言有多好,我都不会只想要一种语言。或者冰淇淋的味道。或音乐风格。或者……或者……或者……;-)Java没有只读和锁定。。。我认为您在示例中使用的是C#。Java没有readonly和lock。。。我认为您在示例中使用的是C。