计数器将记住它的价值

时间:2010-03-21 14:30:12

标签: java constants

我有一个操作复数的任务。每个数字由双r =实部,双i =虚部和字符串名组成。名称必须在构造函数中设置,所以我创建了int计数器,然后我将其值发送到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
//
}

5 个答案:

答案 0 :(得分:4)

很难说出你在做什么,但我怀疑这会解决你当前的问题:

private static int counter = 0;

答案 1 :(得分:2)

你应该counter静态。

您还应该使nameTab成为私有静态字段,然后在setNextName()中,您可以遍历它以查找与给定字符对应的名称,并获取其索引。 (在纯ASCII世界中,当然可以通过从给定字符中减去'A'的数值来简单地计算索引,但我不太确定如何使用Java,在Unicode中,使用疯狂的输入 - 迭代是安全的。)

答案 2 :(得分:1)

在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”的名称会改变,但Person“b”的名称会保持不变。

如果你早上醒来并决定要三只眼睛:

Person.setNumberOfEyes(3);

然后人“a”和人“b”以及其他每个人的例子都会突然有3只眼睛。

您想在计数器声明中添加“静态”。

答案 3 :(得分:1)

是你的代码被多个线程使用,而不是我建议使反制静态不会解决你的问题。

你需要特别注意实现线程同步使用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++; 
    }
}

这样可以在增加计数器的同时确保线程安全(还有其他方法可以提供线程安全性,但这个方法的代码最少)。

答案 4 :(得分:0)

由于字段counter不是static,因此每个对象都有自己的计数器。