2015-11-29 3 views
2

Я создал 2 таймера в 2 отдельных классах. Один таймер увеличивает счетчик int. а другой использует метод get и выводит значение счетчика int.java с использованием методов getter и setter и возврата 0

Проблема является второй таймер только печатает 0, 0, 0 и т.д., если я использую private int counter тогда, если я должен был использовать private static counter он печатает 1,2,3,4,5 и т.д., которые это то, что я хочу. Но я бы предпочел не использовать static, потому что ive было сказано о его плохой практике.

Вот мой основной класс:

import java.util.Timer; 
public class Gettest { 

public static void main(String[] args) { 

    classB b = new classB(); 
    classC c = new classC(); 

    timer = new Timer(); 
    timer.schedule(b, 0, 2000); 
    Timer timer2 = new Timer(); 
    timer2.schedule(c, 0, 2000); }} 

класса B с timer1

import java.util.TimerTask; 
public class classB extends TimerTask { 

private int counter = 0; 

public int getint() 
{ return counter;} 

public void setint(int Counter) 
{ this.counter = Counter;} 

public void run() 
{ counter++; 
    this.setint(counter);}} 

класса C с таймером 2

import java.util.TimerTask; 
public class classC extends TimerTask 
{ 
classB b = new classB(); 

public void run(){ 
System.out.println(b.getint());}} 

Как я мог исправить, так что я это работает с помощью private int counter; ?

+1

1. Пожалуйста, используйте стандартное форматирование Java. Случайное форматирование на лету делает ваш код сложным для программистов Java красным. 2. Создайте и опубликуйте действительный [mcve], чтобы мы могли запускать, тестировать и изменять реальный исполняемый код. Вы заявляете «вот мой основной класс», но это не ваш весь основной класс. Вместо этого создайте и опубликуйте свою ** небольшую ** компилируемую и исполняемую программу, которая демонстрирует вашу проблему для нас, а не ссылку, а скорее здесь с вашим вопросом. –

+1

«Я бы предпочел не использовать статику, потому что мне рассказали о ее плохой практике», все плохо, если вы не используете их правильно. – Ramanlfc

+0

@Hovercraft Full Of Eels я отредактировал сообщение, чтобы включить все в класс, чтобы оно было запущено сейчас. Все, что было необходимо, это импорт. Какие-нибудь советы, которые вы могли бы мне дать? – Ricky

ответ

1

У вас есть два полностью уникальных/отдельных экземпляра ClassB, один из которых вы запускаете с помощью таймера, а другой вы показываете. Отображается один никогда не меняется, так как он не работает в таймере, и поэтому он всегда будет отображать начальное значение 0.

по умолчанию Если изменить его так, у вас есть только один экземпляр:

import java.util.Timer; 
import java.util.TimerTask; 

public class Gettest { 
    private static Timer timer; 

    public static void main(String[] args) { 
     ClassB b = new ClassB(); 
     ClassC c = new ClassC(b); // pass the B instance "b" into C 
     timer = new Timer(); 
     timer.schedule(b, 0, 2000); 
     Timer timer2 = new Timer(); 
     timer2.schedule(c, 0, 2000); 
    } 
} 

class ClassB extends TimerTask { 
    private int counter = 0; 

    public int getint() { 
     return counter; 
    } 

    public void setint(int Counter) { 
     this.counter = Counter; 
    } 

    public void run() { 
     counter++; 
     this.setint(counter); 
    } 
} 

class ClassC extends TimerTask { 
    ClassB b; 

    // add a constructor to allow passage of B into our class 
    public ClassC(ClassB b) { 
     this.b = b; // set our field 
    } 

    public void run() { 
     System.out.println(b.getint()); 
    } 
} 

код будет работать.

В качестве дополнительной рекомендации, пожалуйста, проработайте форматирование кода и старайтесь соответствовать стандартам Java. Например, см. Мой код выше.

2

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

Смежные вопросы