前言
在 Java 编程中,void
和 Void
是两个容易混淆的概念。虽然它们看起来相似,但实际上有着截然不同的用途和特性。
void
关键字
定义
void
是 Java 中的一个关键字。- 用于方法声明中,表示该方法不返回任何值。
用途
- 当一个方法执行某些操作(如打印、修改数据等),但不需要返回结果时,可以使用
void
作为返回类型。 - 方法内部可以有任意数量的语句,但不能有
return
语句返回一个值。不过,可以使用return;
来提前结束方法。
示例
java
public class Example {
public static void main(String[] args) {
// 调用一个 void 方法
printHello();
}
// 定义一个 void 方法
public static void printHello() {
System.out.println("Hello, World!");
}
}
在这个例子中,printHello
方法没有任何返回值,它只是简单地打印一条消息。
Void
类
定义
Void
是java.lang
包中的一个类。- 它是
void
关键字的引用类型包装类。 Void
类是一个不可实例化的类(即不能创建Void
对象)。Void
类只有一个静态字段NULL
,通常用来表示没有实际的Void
值。
用途
- 主要用于泛型(Generics)中,因为泛型不能直接使用基本类型或
void
关键字。 - 在某些情况下,特别是使用函数式接口(如
Consumer
或Supplier
)时,Void
可以用来表示没有返回值的情况。
示例
泛型中的使用
java
import java.util.ArrayList;
import java.util.List;
public class VoidExample {
public static void main(String[] args) {
// 创建一个 List<Void>,但实际上我们不会真正存储 Void 实例
List<Void> voidList = new ArrayList<>();
// 尝试添加 null 到列表中
voidList.add(null);
// 打印列表
for (Void v : voidList) {
System.out.println(v); // 输出: null
}
}
}
在这个例子中,虽然我们创建了一个 List<Void>
,但由于 Void
类不可实例化,我们只能将 null
添加到列表中。
函数式接口中的使用
java
import java.util.function.Consumer;
public class VoidExample {
public static void main(String[] args) {
// 使用 Consumer<Void> 表示一个消费者,它接受一个 Void 类型的参数
Consumer<Void> consumer = (v) -> {
System.out.println("This is a consumer that takes no input.");
};
// 传递 null 作为 Void 类型的值
consumer.accept(null);
}
}
在这个例子中,Consumer<Void>
表示一个消费者,它接受一个 Void
类型的参数。由于 Void
类不可实例化,我们传递 null
作为参数。
获取 Void
的唯一实例
java
public class VoidExample {
public static void main(String[] args) {
// 获取 Void 的唯一实例
Void aVoid = null; // 或者 Void aVoid = Void.TYPE;
// 打印 Void 实例
System.out.println(aVoid); // 输出: null
}
}
在这个例子中,Void
类有一个静态字段 NULL
,我们可以使用 null
或 Void.TYPE
来表示这个唯一的实例。
实际代码例子
使用 R<Void>
的删除操作
假设你有一个 RESTful API 控制器,其中包含一个删除记录的方法:
java
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class WarehouseController {
private final IMmsWarehouseDetailedAppService iMmsWarehouseDetailedAppService;
public WarehouseController(IMmsWarehouseDetailedAppService iMmsWarehouseDetailedAppService) {
this.iMmsWarehouseDetailedAppService = iMmsWarehouseDetailedAppService;
}
@DeleteMapping("/deleteById/{detailId}")
public R<Void> deleteById(@PathVariable Long detailId) {
boolean success = iMmsWarehouseDetailedAppService.deleteById(detailId);
return toAjax(success);
}
public static <T> R<T> toAjax(boolean success) {
if (success) {
return new R<>(200, "操作成功", null);
} else {
return new R<>(500, "操作失败", null);
}
}
}
// 自定义响应类
class R<T> {
private int code;
private String message;
private T data;
public R(int code, String message, T data) {
this.code = code;
this.message = message;
this.data = data;
}
// Getter 和 Setter
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
}
解析
-
@DeleteMapping
注解@DeleteMapping
用于映射 HTTP DELETE 请求到特定的处理方法。/deleteById/{detailId}
是请求路径,其中{detailId}
是路径变量,表示要删除的记录的 ID。
-
方法签名
public R<Void> deleteById(@PathVariable Long detailId)
R<Void>
表示返回一个泛型类型R
,其泛型参数是Void
。这意味着该方法不会返回具体的业务数据,只会返回一个状态信息。@PathVariable Long detailId
表示从 URL 路径中提取detailId
参数,并将其作为方法参数传递。
-
方法体
return toAjax(iMmsWarehouseDetailedAppService.deleteById(detailId));
iMmsWarehouseDetailedAppService.deleteById(detailId)
调用服务层的方法来删除指定 ID 的记录。toAjax(...)
是一个工具方法,将服务层的返回结果转换为一个R
类型的对象,通常包含成功或失败的状态码和消息。
-
自定义响应类
R<T>
R<T>
是一个泛型类,用于封装 API 的响应数据。- 它包含三个属性:
code
(状态码)、message
(消息)和data
(数据)。 data
属性的类型是泛型T
,当T
为Void
时,表示该方法不返回具体的业务数据。
-
工具方法
toAjax
toAjax
是一个工具方法,用于将布尔值转换为R
对象。- 如果删除成功,返回
R<Void>
对象,包含成功状态码和消息;否则,返回失败状态码和消息。
总结
void
是一个关键字,用于方法声明,表示该方法不返回任何值。Void
是一个类,主要用于泛型和某些特定场景下表示没有返回值的情况。它是一个不可实例化的类,只有一个静态字段NULL
。
void
- 定义 :
void
是 Java 中的一个关键字。 - 用途:用于方法声明,表示该方法不返回任何值。
- 通俗理解 :
void
就像一个"空盒子",表示这个方法执行完之后不会给你任何东西。它只是做一些事情,比如打印信息、修改数据等,但不会返回任何结果。
Void
- 定义 :
Void
是java.lang
包中的一个类。 - 用途 :主要用于泛型中,因为泛型不能直接使用基本类型或
void
关键字。 - 通俗理解 :
Void
是一个特殊的"盒子",虽然它里面什么也没有(不可实例化),但它可以用来表示"没有具体的返回值"。在某些情况下,特别是在使用泛型时,我们需要一个占位符来表示没有返回值的情况,这时就可以使用Void
。
通俗对比
void
:方法执行完后没有任何返回值,就像你做了一件事但没有得到任何回报。Void
:方法可能有返回值,但返回的是一个特殊的对象,表示"没有具体的业务数据",但它仍然可以包含一些状态信息(如成功或失败的状态码和消息)。