2010-03-21 9 views
1

J'ai une tâche à effectuer sur un nombre complexe. Chaque nombre est composé de deux parties: r = partie réelle, double i = partie imaginaire et nom de chaîne. Le nom doit être défini dans le constructeur, donc j'ai créé un compteur int, puis j'envoie sa valeur à la fonction setNextName et j'obtiens une lettre de nom. Malheureusement, l'incrémentation de cette valeur 'counter' ne fonctionne que dans le costructor et est de nouveau mise à 0. Comment faire face à cela? Une valeur constante? Et le deuxième problème est que j'ai aussi besoin de fournir la fonction setNextNames (char c) qui va changer la valeur du compteur.Compteur qui se souviendra de sa valeur

Le code:

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 
// 
} 

Répondre

4

Il est difficile de dire ce que vous faites, mais je suppose que cela va résoudre votre problème immédiat:

private static int counter = 0; 
+0

Je souhaite qu'il n'y avait que python ... :) merci – owca

+4

@owca: Pourquoi voudriez-vous vivre dans un univers si limité ?! Peu importe la qualité d'une langue donnée, je ne voudrais pas juste * une * langue. Ou la saveur de la crème glacée. Ou style de musique. Ou ... ou ... ou ... ;-) –

+1

@TJC: bien dit :) – codaddict

2

Vous devriez faire counter statique.

Vous devez également faire nameTab un champ statique privé, puis dans setNextName(), vous pouvez itérer à travers pour trouver le nom correspondant au caractère donné, et obtenir son index. (dans le monde ASCII, bien sûr, on pourrait simplement calculer l'index en soustrayant la valeur numérique de 'A' du caractère donné, mais je ne suis pas sûr de savoir comment cela fonctionnerait avec Java, en Unicode, avec des entrées folles - l'itération est du bon côté.)

0

Parce que le champ counter n'est pas static, chaque objet a son propre compteur.

1

Dans les langues OO Il y a généralement deux types de variables qui entrent dans une classe:

  • variables d'instance qui sont propres à chaque instance
  • variables de classe qui sont partagées par toutes les instances de la classe

Étant donné une classe comme:

public class Person 
{ 
    // class variable 
    private static int numberOfEyes; 

    // instance variable 
    private String name; 

    // other code goes here 
} 

Si y ous devait faire quelque chose comme:

Person a = new Person("Jane Doe"); 
Person b = new Person("John Doe"); 

puis faire quelque chose comme:

a.setName("Jane Foe"); 

le nom de la personne « un » changerait, mais celui de la personne « b » resterait le même.

Si vous me suis réveillé un matin et a décidé que vous vouliez 3 yeux:

Person.setNumberOfEyes(3); 

alors personne « a » et personne « b » et tous les autres cas il y aurait personne sur 3 soudainement les yeux aussi bien.

Vous voulez mettre "statique" dans votre déclaration de compteur.

1

est votre code étant utilisé par plusieurs threads que je suggérerais que faire du compteur statique ne résoudra pas votre problème.

Vous devez faire très attention en implémentant la synchronisation des threads. Utilisez le mot-clé lock comme indiqué ci-dessous.

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++; 
    } 
} 

, ce qui assurera la sécurité des threads également en incrémenter votre compteur (il y a une autre façon aussi pour assurer la sécurité de fil, mais celui-ci est d'avoir moins de code).

+0

Java n'a pas readonly et lock ... Je pense que vous utilisez C# dans votre exemple. – TofuBeer

Questions connexes