公共访问修饰符表示该成员可以从任何其他类访问。换句话说,公共成员对于同一包中的其他类以及其他包中的所有类都是可见的。
项目中,一般controller类、 service类、mapper类等都是用public修饰的:
在项目中,通常将 Controller 类和 Service 类声明为
public
是为了确保它们可以被其他类访问。这是因为 Controller 类和 Service 类通常是应用程序的入口点和核心组件,需要被其他组件或类调用。以下是几个原因:
可访问性: Controller 类和 Service 类通常包含了应用程序的核心业务逻辑和控制逻辑。将它们声明为
public
可以确保其他组件或类可以轻松地访问和调用它们的方法。接口暴露: 在基于 MVC 架构的应用程序中,Controller 类充当了用户请求的入口点,需要暴露接口供客户端调用。因此,它们必须是公共的,以便客户端能够访问到相应的接口方法。
依赖注入: 在使用依赖注入(Dependency Injection)进行组件注入时,通常需要将 Service 类声明为
public
,以便其他类或组件可以注入它们的实例。测试性: 将 Controller 类和 Service 类声明为
public
可以使得它们更容易进行单元测试。测试类可以直接访问和调用这些类的方法,以验证其行为和逻辑。虽然将 Controller 类和 Service 类声明为
public
可能会暴露一些内部实现细节,但通过良好的封装和设计,可以最大限度地减少对内部实现的直接访问,并保持类的安全性和可维护性。
实体类一般也都是public的,除了可访问性之外,还需要对它们的数据传递问题进行考虑。
数据传递: 在应用程序中,实体对象通常会被传递给其他组件或者进行序列化和反序列化操作。将实体类声明为
public
可以确保实体对象能够被正确地序列化和反序列化,或者被其他组件正确地接收和处理。
- 类中的公共方法:假设有一个
Car
类,其中有一个公共方法drive()
,任何其他类都可以调用这个方法,比如Car car = new Car(); car.drive();
。- 公共变量:如果类中有一个公共变量
int speed;
,则其他类可以直接访问和修改这个变量。
私有访问修饰符表示该成员只能在定义它的类中访问。私有成员对于同一包中的其他类是不可见的,更不用说其他包中的类了。
最常见的,实体类是以public修饰的,但是其属性一般以private修饰的 。因此在别的类中,我们需要使用这个某个类的私有属性时,不可以直接这个类的实例+点+属性,而是要调用对应的get与set方法(也就是为什么通常情况下get与set方法是public的)。
这种设计考虑基于以下几点:
封装性: 使用
private
修饰符可以隐藏实体类内部的实现细节,只对外部提供必要的访问接口。这有助于实现类的封装和信息隐藏,提高了代码的安全性和可维护性。数据保护: 将实体类的成员属性设为私有的可以防止外部类直接访问和修改实体对象的内部状态,避免了不合法的数据操作和数据泄露。
业务逻辑: 通过公共的 getter 和 setter 方法可以实现对实体对象的属性进行合法性验证和业务逻辑处理,确保数据的一致性和有效性。
- 类中的私有方法:假设
Car
类中有一个私有方法calculateFuelConsumption()
,这个方法只能被Car
类内部的其他方法调用,而无法被其他类直接调用。- 私有变量:如果类中有一个私有变量
int mileage;
,则只有Car
类内部的方法才能访问和修改这个变量。
受保护的访问修饰符表示该成员对于同一包中的其他类是可见的,同时对于其他包中的子类也是可见的。换句话说,受保护成员对于同一包中的其他类和其他包中的子类是可见的,但对于其他包中的非子类则不可见。
在Java中,
protected
修饰符用于指定访问权限,它允许类的成员(字段、方法等)被定义在同一包中的其他类或者在不同包中的子类所访问。这种设计有几个目的和用途:
封装性: 使用
protected
修饰的成员可以被子类访问,这使得父类可以控制对其内部数据和行为的访问权限,同时允许子类扩展父类的功能。继承:
protected
修饰符使得子类可以继承父类的成员,包括字段和方法。这样,子类可以在继承父类的基础上添加额外的功能或修改已有的功能。模块化设计: 使用
protected
修饰符可以划分模块化的代码结构,允许相关的类在同一包中共享某些成员,同时限制其他包中的类对这些成员的访问。框架和库的设计: 在框架和库的设计中,某些类的部分行为可能需要由使用者来扩展或定制。通过使用
protected
修饰符,库的作者可以将部分接口留给使用者来实现,同时确保这些接口仅在继承关系中可见。
- 受保护的方法:假设有一个
Vehicle
类,其中有一个受保护的方法startEngine()
,其他包中的子类可以直接调用这个方法,但其他类无法访问。- 受保护的变量:如果类中有一个受保护的变量
String color;
,则其他包中的子类可以直接访问和修改这个变量,但其他类无法访问。
例子:下面是对业务类异常的定义
- public class ServiceException extends RuntimeException {
-
- protected HttpStatus statusCode = HttpStatus.INTERNAL_SERVER_ERROR;
-
- private String code;
- /**
- * 要返回前端的数据
- */
- private Object data;
-
-
- public ServiceException(String code, String message) {
- super(message);
- this.code = code;
-
- }
-
- public ServiceException(String code, String message, Object data) {
- super(message);
- this.code = code;
- this.data = data;
- }
-
- public HttpStatus getStatusCode() {
- return statusCode;
- }
-
- public void setStatusCode(HttpStatus statusCode) {
- this.statusCode = statusCode;
- }
-
- public String getCode() {
- return code;
- }
-
-
- public Object getData() {
- return data;
- }
-
- public void setData(Object data) {
- this.data = data;
- }
- }
下面是无权限异常对业务类异常的继承:
- public class NoPermissionException extends ServiceException {
-
- private static final long serialVersionUID = 8207742972948289957L;
-
- public NoPermissionException(String message) {
- super(SystemErrorCodeV1.NO_PERMISSION, message);
- this.statusCode = HttpStatus.UNAUTHORIZED;
- }
-
-
- }
这里的NoPermissionException没有声明statusCode这个属性,但是可以直接this.调用这个从父类继承过来的属性。
如果不指定访问修饰符,则默认访问修饰符是包级私有(package-private)。这意味着成员对于同一包中的其他类是可见的,但对于其他包中的类是不可见的。
- 默认方法和变量:假设有一个包级私有类
Engine
,其中有一个默认访问权限的方法start()
,其他同一包中的类可以直接调用这个方法,但其他包中的类无法访问。- 默认变量:如果类中有一个默认访问权限的变量
boolean engineRunning;
,则其他同一包中的类可以直接访问和修改这个变量,但其他包中的类无法访问。