Java 将记住其值的计数器

Java 将记住其值的计数器,java,constants,Java,Constants,我有一项任务要处理复数。每个数字由双r=实部、双i=虚部和字符串名组成。名称必须在构造函数中设置,所以我创建了int counter,然后将其值发送到setNextName函数并返回名称字母。不幸的是,增加这个“计数器”值只在costructor中起作用,然后它再次被设置为0。怎么处理?一些常量值?第二个问题是,我还需要提供setNextNames(char c)函数来更改计数器的当前值 守则: public class Imaginary { private double re; priva

我有一项任务要处理复数。每个数字由双r=实部、双i=虚部和字符串名组成。名称必须在构造函数中设置,所以我创建了int counter,然后将其值发送到setNextName函数并返回名称字母。不幸的是,增加这个“计数器”值只在costructor中起作用,然后它再次被设置为0。怎么处理?一些常量值?第二个问题是,我还需要提供setNextNames(char c)函数来更改计数器的当前值

守则:

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。