如何在没有内部阶级的情况下改变?

时间:2013-11-26 15:18:46

标签: java

我有一个如下例子。它使用两个内部类,可以直接访问其封闭实例的方法和字段。有意义的是不使用内部类吗?以及如何修改它。

package java_example150;

public class TestThread3{
    private int j;
    public static void main(String[] args){
        TestThread3 t = new TestThread3();
        Inc inc = t.new Inc();
        Dec dec = t.new Dec();

        for(int i=0;i<2;i++){
          Thread ts = new Thread(inc);
          ts.start();
          ts= new Thread(dec);
          ts.start();
        }
    }

    private synchronized void inc(){
        j++;
        System.out.println(Thread.currentThread().getName()+"-inc:"+j);
    }

    private synchronized void dec(){
        j--;
        System.out.println(Thread.currentThread().getName()+"-dec:"+j);
    }

    class Inc implements Runnable{
       public void run(){
        for(int i=0;i<10;i++){
         inc();
        }
       }
    }

    class Dec implements Runnable{
         public void run(){
          for(int i=0;i<10;i++){
           dec();
          }
         }
    }

}

3 个答案:

答案 0 :(得分:0)

在你的例子中,我认为没有必要重构它。你可以这样离开。当只有一个其他类需要内部类时才可以使用内部类,并且它们只能由该类访问/实例化。

如果你需要在另一个类中使用相同的功能,你可以重构它并将这些类移到单独的文件中。

答案 1 :(得分:0)

线程需要传入Runnable类型作为线程的入口点。内部类是这样做的好方法。

使用匿名类来完成它可能是有意义的(特别是在这个简短的例子中)。你可以像这样重写你的循环:

for(int i=0;i<2;i++){
    Thread ts = new Thread(new Runnable() {
        public void run() {
            for(int i = 0; i < 10; i++) inc();
        }    
    );

    ts.start();
    ts= new Thread(new Runnable() {
        public void run() {
            for(int i = 0; i < 10; i++) dec();
        }    
    );
    ts.start();
}

答案 2 :(得分:0)

当您尝试使用非内部课程时发生了什么?你试图通过避免内部阶级来解决困难吗?

您可以转换为非内部类;你只需要将TestThread3的实例传递给每个对象。