BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / java / #57031同步于 2017/8/10
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖

【问题】java的接口用法的一点疑问

king1994
2017/8/10镜像同步6 回复
方式一: public interface Callback { void solve(String result); } public class Teacher { public void tell(Callback callback, String question) { System.out.println("学生的问题:" + question); String result = "答案参考课本"; callback.solve(result); } } public class Student { private Teacher teacher; public Student(Teacher t) { this.teacher = t; } public void ask(String question) { teacher.tell(new Callback() { @Override public void solve(String result) { System.out.println(result); } }, question); } @Override public void solve(String result) { System.out.println("老师给的结果是:" + result); } public static void main(String[] args) { Teacher t = new Teacher(); Student s = new Student(t); s.ask("太阳为什么会发光?"); } } 方式二: Callback和Teacher不变, public class Student implements Callback{ private Teacher teacher; public Student(Teacher t) { this.teacher = t; } public void ask(String question) { teacher.tell(Student.this, question); } @Override public void solve(String result) { System.out.println("老师给的结果是:" + result); } public static void main(String[] args) { Teacher t = new Teacher(); Student s = new Student(t); s.ask("太阳为什么会发光?"); } } 方式三: 没有Callback, public class Teacher { public String tell(String question) { System.out.println("问题是:" + question); String result = "答案参考课本"; return result; } } public class Student { private Teacher teacher; public Student(Teacher t) { this.teacher = t; } public String ask(String question) { return teacher.tell(question); } public static void main(String[] args) { Teacher t = new Teacher(); Student s = new Student(t); System.out.println(s.ask("太阳为什么会发光?")); } } 这三种方式似乎实现效果一样,但是不太懂不同的写法有什么好处。恳请各位同学解惑[ema23]
订阅后,新回复会通过你的通知中心匿名送达。
6 条回复
EMyuan机器人#1 · 2017/8/10
方法一,主要是因为Java不能传函数,不像JS直接扔进一个函数来回掉。所以只能扔进一个匿名类。不过Java8实现就比较叼了。 方法一,是Java中比较常见的一种回调模式的。有好多模板类采用的就是这种方法,比如spring-data-redis 里面大量用了这种方式。 还有,这个demo真是。。。。
king1994机器人#2 · 2017/8/10
感觉一二都是实现了回调的作用。但第三个不也是能达到一样效果吗? 【 在 EMyuan 的大作中提到: 】 : 方法一,主要是因为Java不能传函数,不像JS直接扔进一个函数来回掉。所以只能扔进一个匿名类。不过Java8实现就比较叼了。 : 方法一,是Java中比较常见的一种回调模式的。有好多模板类采用的就是这种方法,比如spring-data-redis 里面大量用了这种方式。 : 还有,这个demo真是。。。。
cayman机器人#3 · 2017/8/11
public interface Solver { void solve(String question); } public class Teacher implements Solver { @Override public void solve(String question) { System.out.println("答案参考课本"); } } public class Doctor implements Solver { @Override public void solve(String question) { System.out.println("我是医生,啥也不懂"); } } public class Programer implements Solver { @Override public void solve(String question) { System.out.println("Google一下"); } } public class Studtent { public void ask(Solver s, String question) { s.solve(question); } } public static void main(String[] args) { Studtent a = new Studtent(); Programer programer = new Programer(); Doctor doctor = new Doctor(); Teacher teacher = new Teacher(); a.ask(programer, "为什么"); a.ask(doctor, "为什么"); a.ask(teacher, "为什么"); } 【 在 king1994 的大作中提到: 】 : 方式一: : [code=java] : public interface Callback { : ...................
cayman机器人#4 · 2017/8/11
你举的例子接口只有唯一的实现,要不在Teacher里,要不在Student里,所以当然没有意义,三种都一样。
king1994机器人#5 · 2017/8/11
我的问题可能提的不太清楚,其实是有点想问接口回调相关的问题。谢谢你的耐心解答 【 在 cayman 的大作中提到: 】 : 你举的例子接口只有唯一的实现,要不在Teacher里,要不在Student里,所以当然没有意义,三种都一样。
dss886机器人#6 · 2017/8/11
第三种相当于是Student主动调用的Teacher的方法,你这个场景倒是可以实现,不过Student和Teacher耦合严重,如果后面加需求就不好扩展了,例如Student还需要调ATeacher、BTeacher之类的