在 Java 中创建回调函数
回调功能用于事件驱动编程。当相应事件发生时,引用将传递给调用的函数。
我们使用接口来实现 Java 中的回调,因为它不支持函数指针。
本文介绍如何在 Java 中创建和使用回调函数。
在 Java 中使用接口创建回调函数
Java 中的接口是指定类行为的抽象类型。它是一个类的蓝图类。
我们可以创建一个接口和多个类来演示 Java 中的回调。
下面的代码实现了一个接口和四个类来计算员工的工资。要调用函数,我们传递接口的引用;这是回调。
该代码通过从总工资中减去 10% 来计算净工资。查看每个类的输出;我们运行代码四次。
import java.util.Scanner;
//Create interface
interface Salary {
double Person_Salary();
}
// Class for Jack's Salary
class Jack implements Salary {
public double Person_Salary(){
return 5000.0;
}
}
//Class for Michelle's Salary
class Michelle implements Salary {
public double Person_Salary(){
return 4000.0;
}
}
//Class for Jhonny's Salary
class Jhonny implements Salary {
public double Person_Salary(){
return 3000.0;
}
}
//Class for Mike's Salary
class Mike implements Salary {
public double Person_Salary(){
return 3500.0;
}
}
class Employee_Salary {
public static void main(String[] args)throws ClassNotFoundException, IllegalAccessException, InstantiationException{
Scanner sc = new Scanner(System.in);
System.out.println("Enter the Employee Name: ");
// name of the employee
String Employee = sc.next();
// Store the employee name in an object temp
Class temp = Class.forName(Employee);
// Create the new object of the class whose name is in temp
// Interface Salary's reference is now referencing the new object created above
Salary reference = (Salary)temp.newInstance();
//Call the method to calculate net salary and pass interface reference - this is a callback.
//Here reference refers to the function Person_Salary() of both Jack and Michelle's classes
Calculate_Salary(reference);
}
static void Calculate_Salary(Salary E_Salary){
// calculate Salary Deduction Which is 10 percent
double salary_deduction = E_Salary.Person_Salary() * 0.1;
// The gross salary
double gross_salary = E_Salary.Person_Salary();
// Calculate the net salary
double net_salary = gross_salary - salary_deduction;
// Show the net salary
System.out.println("The Net Salary of Employee is =" + net_salary);
}
}
输出:
Enter the Employee Name:
Jack
The Net Salary of Employee is =4500.0
Enter the Employee Name:
Michelle
The Net Salary of Employee is =3600.0
Enter the Employee Name:
Jhonny
The Net Salary of Employee is =2700.0
Enter the Employee Name:
Mike
The Net Salary of Employee is =3150.0
在 Java 中创建同步和异步回调函数
同步回调
代码执行将等待或阻止同步回调的事件,直到它返回响应。回调将在返回调用语句之前执行其所有工作。
同步有时似乎滞后。下面的代码为回调函数实现了一个简单的同步任务。
// Create Interface
interface Delftstack {
void delftstack_event();
}
class Delftstack_Two {
// Delftstack Field
private Delftstack Delft;
// setting the register_delftstack function
public void register_delftstack(Delftstack Delft){
this.Delft = Delft;
}
// This is our synchronous task
public void Hello_Delftstack(){
// perform any operation
System.out.println("Hello! This is delftstack callback from before the synchronous task.");
// check if listener is registered.
if (this.Delft != null) {
// invoke the callback method of class A
Delft.delftstack_event();
}
}
// Main
public static void main(String[] args){
Delftstack_Two Demo_Object = new Delftstack_Two();
Delftstack Delft = new Delftstack_One();
Demo_Object.register_delftstack(Delft);
Demo_Object.Hello_Delftstack();
}
}
class Delftstack_One implements Delftstack {
@Override
public void delftstack_event(){
System.out.println("Hello! This is delftstack callback from after the synchronous task.");
}
}
输出:
Hello! This is delftstack callback from before the synchronous task.
Hello! This is delftstack callback from after the synchronous task.
异步回调
另一方面,异步回调不会阻止代码执行。
在 Java 中,我们需要创建一个线程来开发一个异步任务,并在里面实现回调。当调用从事件返回时,它返回到异步的回调函数。
下面的代码示例为回调函数实现了一个简单的异步任务。
// Create Interface
interface Delftstack {
void delftstack_event();
}
class Delftstack_Two {
// Delftstack Field
private Delftstack Delft;
// setting the register_delftstack function
public void register_delftstack(Delftstack Delft){
this.Delft = Delft;
}
// The Asynchronous
public void Hello_Delftstack(){
// An Asynchronous must be executed in a new thread
new Thread(new Runnable() {
public void run(){
System.out.println("Hello! This is delftstack operation inside the asynchronous task.");
// check if Delft is registered.
if (Delft != null) {
// invoke the callback method of class A
Delft.delftstack_event();
}
}
}).start();
}
// Main
public static void main(String[] args){
Delftstack_Two Demo_Object = new Delftstack_Two();
Delftstack Delft = new Delftstack_One();
Demo_Object.register_delftstack(Delft);
Demo_Object.Hello_Delftstack();
}
}
class Delftstack_One implements Delftstack {
@Override
public void delftstack_event(){
System.out.println("Hello! This is delftstack callback from after the asynchronous task.");
}
}
输出:
Hello! This is delftstack operation inside the asynchronous task.
Hello! This is delftstack callback from after the asynchronous task.
相关文章
Java 中用于垃圾回收的 System.gc()
发布时间:2023/09/19 浏览次数:84 分类:Java
-
本文介绍了如何在 Java 中使用 System.gc() 进行垃圾收集。System.gc() 是 Java 中提供的用于垃圾收集的 API,它执行自动内存管理。
在 Java 中从一个函数中返回空值
发布时间:2023/09/19 浏览次数:186 分类:Java
-
本文介绍如何在 Java 中的函数中不返回任何内容。每个在其签名中具有返回类型的函数都必须返回相同类型的值,否则编译将产生错误,并且代码将不会执行。
Java 中的虚拟函数
发布时间:2023/09/19 浏览次数:153 分类:Java
-
本文介绍什么是 Java 中的虚拟函数/方法。本文介绍了什么是 Java 中的虚拟函数/方法以及如何使用 Java 中的虚拟函数。
在 Java 中返回一个布尔方法
发布时间:2023/09/19 浏览次数:51 分类:Java
-
本教程说明了如何在 Java 中返回布尔方法。本文将介绍在 Java 中返回布尔型方法的方法。Java 中带有 return 语句的布尔方法的结构
在 Java 中播放声音
发布时间:2023/09/19 浏览次数:151 分类:Java
-
本教程介绍了用 Java 播放音频文件方法。Java 应用程序有时会被要求播放音频文件。鉴于声音是基于时间的数据,因此必须以正确的速率传递声音才能呈现出来,以供用户感知。
如何在 Java 中向一个数组添加新元素
发布时间:2023/09/19 浏览次数:187 分类:Java
-
讨论如何在 Java 中向一个数组中添加新元素。由于数组的大小是固定的,可能的解决方法是使用数组列表或创建一个新的数组,将之前数组中的所有元素复制过来,然后再添加一个新元
如何在 Java 中初始化一个数组
发布时间:2023/09/19 浏览次数:193 分类:Java
-
本文通过各种实例介绍了 Java 中如何声明和初始化一个数组。在 Java 中初始化一个数组有两种方法。
如何在 Java 中把一个数组转换为一个列表
发布时间:2023/09/19 浏览次数:199 分类:Java
-
本文讨论了在 Java 中把数组转换为列表的三种方法。创建一个空列表并添加所有元素 这是一种非常简单且显而易见的方法。