2016-01-17 1 views
1

J'essaye de faire un cours qui vous permet de répéter une tâche un certain nombre de fois, ou jusqu'à ce qu'une condition soit rencontrée. Avant de poursuivre, considérer les points suivants:Java | boolean ne réévalue pas/met à jour

int test = 0; 

Et ma classe de répétition:

public static abstract class Repeat { 

    public void loop(int c) { 
     for (int i = 0; i < c; i++) { 
      run(); 
     } 
    } 

    public void until(boolean c) { 
     while (!c) { 
      run(); 
     } 
    } 

    public abstract void run(); 
} 

La question que j'ai est la méthode until(boolean c), pas la méthode loop(int c). La méthode de boucle fonctionne très bien, comme le prouve ci-dessous:

public static void main(String[] args) { 
    new Repeat() { 
     @Override 
     public void run() { 
      test += 1; 
      System.out.println(test); // so I know what test currently is 
     } 
     { 
      loop(10); 
     } 
    }; 
} 

qui change test en 1, 10 fois. La console prouve que correcte:

1 
2 
3 
4 
5 
6 
7 
8 
9 
10 

Maintenant pour la question. Si j'essaie d'utiliser la méthode until(), il deviendra lag lag si je ne termine pas le lancement dans quelques secondes, car il va incrémenter test infiniment.

public static void main(String[] args) { 
    new Repeat() { 
     @Override 
     public void run() { 
      test += 1; 
      System.out.println(test); // so I know what test currently is 
     } 
     { 
      loop(10); 
     } 
    }; 
    new Repeat() { 
     @Override 
     public void run() { 
      test -= 1; 
      System.out.println(test); 
     } 
     { 
      until(test == 0); 
     } 
    }; 
} 

Cela continue indéfiniment. Mon hypothèse est que parce que le booléen qui est passé en (test == 0)n'est jamais mis à jour, donc, si cela est correct, quelqu'un peut-il me dire comment le mettre à jour? Et si mon hypothèse est fausse, qu'est-ce qui la cause et comment puis-je la réparer?

Merci à tous ceux qui lit réellement chaque mot que je "tapé" (copy-collé la plupart du temps).

Répondre

5

Lorsque vous passez des primitives en Java par des méthodes, il passe la valeur, ce qui signifie que vous passez seulement true ou false, qui ne met jamais à jour parce que c'est juste une valeur. Si vous faites quelque chose comme ci-dessous, cependant, il devrait fonctionner:

public static abstract class Repeat { 
    public void loop(int c) { 
     for (int i = 0; i < c; i++) { 
      run(); 
     } 
    } 

    public void until() { 
     while (isLooping()) { 
      run(); 
     } 
    } 

    public abstract void run(); 
    public abstract boolean isLooping(); 
} 

retour si vous souhaitez continuer en boucle à travers isLooping() vous permettra de mettre à jour la valeur de cette valeur booléenne de la vôtre.

+0

Je n'ai pas fini par utiliser votre réponse directement, mais cela m'a finalement permis de trouver la solution. Merci! –

-1

Vous commencez par test = 0 et votre programme décrémente uniquement le test. donc à la première if-clause son -1 leur -2 .... son jamais 0

+0

Actuellement, non. Dans mon code, j'ai d'abord le bloc de boucle qui incrémente 'test' à 10, ALORS vient le bloc until qui est censé le ramener à zéro. –

+0

essayé de rendre le test statique? – osanger

1

La valeur de test == 0 est false lorsque vous exécutez until(test == 0);. Donc, vous passez false à until(), et à l'intérieur until(), la valeur de !c est donc vraie et ne change jamais.

Vous semblez penser qu'en passant une expression booléenne à une méthode, la méthode réévalue l'expression à chaque fois que c est évaluée. Ce n'est pas comme ça que ça fonctionne. L'expression est évaluée avant que l'appel à la méthode soit effectué et la valeur de cette expression est transmise.