Счетчик, который запомнит его значение - PullRequest
1 голос
/ 21 марта 2010

У меня есть задача оперировать комплексным номером.Каждое число состоит из двойной r = действительной части, двойной i = мнимой части и имени строки.Имя должно быть установлено в конструкторе, поэтому я создал int counter, затем я отправляю его значение в функцию setNextName и получаю букву имени обратно.К сожалению, увеличение этого значения 'counter' работает только в конструкторе, а затем снова устанавливается на 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 ]

4 голосов
/ 21 марта 2010

Трудно сказать, что вы делаете, но я подозреваю, что это решит вашу непосредственную проблему:

private static int counter = 0;
2 голосов
/ 21 марта 2010

Вы должны сделать counter статичным.

Вы также должны сделать nameTab частным статическим полем, затем в setNextName() вы можете выполнить итерацию по нему, чтобы найти имя, соответствующее данному символу, и получить его индекс. (в простом мире ASCII, конечно, можно просто вычислить индекс, вычтя числовое значение «A» из заданного символа, но я не совсем уверен, как это будет работать с Java, в Unicode, с сумасшедшими входами итерация на безопасной стороне.)

1 голос
/ 21 марта 2010

Ваш код используется несколькими потоками, чем я предположил бы, что создание счетчика статического не решит вашу проблему.

Вы должны проявить особую осторожность, реализовав синхронизацию потоков, используя ключевое слово 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++; 
    }
}

это также обеспечит безопасность потоков при увеличении счетчика (есть и другие способы обеспечения безопасности потоков, но этот код имеет наименьший код).

1 голос
/ 21 марта 2010

В ОО-языках обычно есть два типа переменных, которые входят в класс:

  • переменные экземпляра, уникальные для каждого экземпляра
  • переменные класса, которые являются общими для всех экземпляров класса

Учитывая класс как:

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");

имя человека "a" изменится, но имя человека "b" останется прежним.

Если вы проснулись однажды утром и решили, что хотите 3 глаза:

Person.setNumberOfEyes(3);

тогда Персона "а" и Персона "б" и любой другой экземпляр Персоны там тоже вдруг получат 3 глаза.

Вы хотите включить "static" в декларацию счетчика.

0 голосов
/ 21 марта 2010

Поскольку поле counter не равно static, каждый объект имеет свой собственный счетчик.

...