尝试使用Java模拟orher类中的Thread行为

时间:2017-05-16 12:09:45

标签: java interface java-threads

我有这堂课:

public class MyThread {
    public static void main(String[] args) {
        Thread thread = new Thread() {
            public void run() {
                System.out.print("Test from Anonymous Class!");
            }
        };
        Thread newThread = new Thread(thread);
        newThread.run();
    }
}

当我运行此程序时,我得到Test from Anonymous Class!

现在,我试图用另一个类来模拟这种行为:

interface MyInterface {
    public void doTest();
}

class MyClass implements MyInterface {
    public MyClass() {}

    public MyClass(MyInterface myInterface) {}

    public void doTest() {
        System.out.println("Test from MyClass!");
    }
}

public class Test {
    public static void main(String[] args) {
        MyClass myClass1 = new MyClass() {
            public void doTest() {
                System.out.println("Test from Anonymous Class!");
            }
        };

        MyClass myClass2 = new MyClass(myClass1);
        myClass2.doTest();
    }
}

当我运行此程序时,我得到Test from MyClass!。为什么在第一个例子中打印出Test from Anonymous Class!?如何使用MyClass类获得相同的行为?

提前致谢!

4 个答案:

答案 0 :(得分:2)

那是因为你对你的参数做了什么事myClass1

public MyClass(MyInterface myInterface) {}

你得到参数,那又怎样?如果要执行参数所做的操作,则必须调用方法:

myClass1.doTest()


>"Test from Anonymous Class!"

您正在做的事情很少见,但如果您从正确的对象调用该方法,您将得到您想要的内容:)

另一种罕见但有效的方法是拥有一个实例变量,并将其命名为:

class MyClass implements MyInterface {
    MyClass myOtherClass;

    public MyClass() {}

    public MyClass(MyInterface myInterface) {
       this.myOtherClass = myInterface;
    }

    public void doTest() {
        System.out.println("Test from MyClass!");
    }
}

然后,你调用其中的方法:

public class Test {
    public static void main(String[] args) {
        MyClass myClass1 = new MyClass() {
            public void doTest() {
                System.out.println("Test from Anonymous Class!");
            }
        };

        MyClass myClass2 = new MyClass(myClass1);
        myClass2.myOtherClass.doTest(); // calling method from myClass1
    }
}

答案 1 :(得分:2)

您需要初始化目标,因此它会调用您班级中的方法

class MyClass implements MyInterface {
        MyInterface myInterface;
        public MyClass() {}

        public MyClass(MyInterface myInterface) {
            this.myInterface=myInterface;
        }

        public void doTest() {
            if(myInterface !=null){
                myInterface.doTest();
                return;
            }
            System.out.println("Test from MyClass!");
        }
    }

答案 2 :(得分:2)

似乎你想从一个类中实现一个委托,该类将构造函数的参数作为接口。

当您调用func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) { var bId = Helper.businessId as String let param = ["id" : bId] as! [String : AnyObject] if editingStyle == .delete{ print(Helper.memId) print("Deleted") var myDictionary = self.List[indexPath.row] as! NSDictionary var bId : String! if myDictionary.allKeys.count>0 { bId = myDictionary["id"] as! String } var bb = bId as String if editingStyle == .delete{ print(Helper.memId) print("Deleted") Alamofire.request("http://api.noattabeta.com/api/v1/user/current/memberships/\(bb)", method: .delete, headers: ["Authorization":Helper.token]).responseString {response in print("In Response") switch response.result { case .success: DispatchQueue.main.async { let myAlert = UIAlertController(title:"Alert", message: "Do You want to delete",preferredStyle:UIAlertControllerStyle.alert) let okAction = UIAlertAction(title:"Ok",style:UIAlertActionStyle.default,handler:{ (action: UIAlertAction!) in self.tableView.reloadData() }) myAlert.addAction(okAction) let cancelAction = UIAlertAction(title:"Cancel",style:UIAlertActionStyle.default,handler:{ (action: UIAlertAction!) in self.tableView.reloadData() }) myAlert.addAction(okAction) myAlert.addAction(cancelAction) self.present(myAlert, animated: true, completion: nil) } case .failure(let error): print(error) }}} 而您的自定义类未模仿此行为时,Thread构造函数使用作为参数提供的Runnable实例作为执行目标。你确实对传递的Thread#start()参数没有做任何事情:

MyInterface

要实施委派,您应在public MyClass(MyInterface myInterface) {} 中添加MyInterface字段,并在构造函数中对其进行评估。
然后在MyClass方法中使用它。

doTest()

答案 3 :(得分:1)

答案很简单。 Thread中的run()方法被覆盖,它将始终是要运行的方法。

在第二个例子中,myClass2使用它实例doTest()方法,并且从不使用myClass1,除了在constuctor中。