封装
封装是什么
封装
是面向对象编程的基本原则,官方说封装就是把对象的属性和行为(或方法)结合为一个独立的整体,并隐藏对象的内部实现细节。
什么意思呢?
前半句对象的属性和行为(或方法)结合为一个独立的整体
就是指我们面向对象抽象出来的类class作为一个整体;
后半句隐藏对象的内部实现细节
就是指访问权限控制,我可以把类里的属性和方法,该露的露出来,该藏的藏起来,这才是封装的核心点。
封装的实现方式
java
中实现封装特性要用到提供的语法关键字(访问权限修饰符),共有四种,权限从小到大分别为private
、default
(无)、protected
、public
,修饰范围如下:
修饰符 | 类内部 | 同包内 | 子类 | 其他包 |
---|---|---|---|---|
private | 可访问 | 不可访问 | 不可访问 | 不可访问 |
default(无) | 可访问 | 可访问 | 不可访问 | 不可访问 |
protected | 可访问 | 可访问 | 可访问 | 不可访问(除非通过继承) |
public | 可访问 | 可访问 | 可访问 | 可访问 |
封装的实际使用
那么实际项目中封装具体用在哪里呢?
访问修饰符可用来修饰类
、方法
和属性
,但修饰类时只可使用public
和default
(无)两种修饰符;
实际使用情况如下:
- 修饰
类
时:工作中基本使用public
,因为开发过程中大多类都需要交互依赖使用,只有当你需要控制同包内才能访问该类时适合用default; - 修饰
方法
时:工作中基本public
和private
,比如你有A,B两个业务方法,他们有一个公用子方法C,这个时候你就可以用public
修饰A,B方法,private
修饰C方法,因为C方法没必要公开,仅暴露有限的方法这样可以提高类的易用性; - 修饰
属性
时:工作中同样使用public
和private
较多,private
用的最多的地方就是私有化类的属性,public
用的最多的就是定义不可变静态常量;
总体来看工作中实际使用最多的就是private
(只有我自己用)和public
(大家都能用),而default
和protected
用的很少,只有一些源码中容易看到;个人认为主要原因就是方便快捷,这样其实挺不规范,项目开发久了容易有很多名称类似的类/方法需要我们仔细分辨使用,最好还是具体情况具体使用;
实体类中属性为什么都用private修饰
刚工作时我一直没理解,访问修饰符有四种,为什么工作中数据实体总是全用private
修饰呢? 我就想是一种规范照抄吧,毕竟大家都这么用。
后来为究其根本我查询了多方资料,主要以下两点:
封装的原则
简单说就是可以理解成是封装特性的规范。
在java
中,封装意味着将对象的状态(属性)与操作这些状态的方法(函数)放在一起,限制外部代码直接访问对象的内部状态。通过使用private
修饰符将属性设为私有,并通过public
的get
和set
方法来访问和修改这些属性,可以控制对敏感数据的访问,保护数据的完整性。扩展性和可维护性
这里需要举例说明,比如一个人类class
,要求在设置年龄的时候我们要限制1-100
否则默认1,输出信息的时候需要年龄加上岁
,最终调用地方有多处;
假设我们设置的属性是public
,我们操作属性时就可以person.age=18
这样去赋值,实现代码如下:
public class Person {
public String name;
public int age;
}
public static void main(String[] args) {
Person person1 = new Person();
person1.name="小明";
person1.age=120;
if(person1.age<1||person1.age>100){
person1.age=1;
}
System.out.println(person1.name+person1.age+"岁");
Person person2 = new Person();
person2.name="Lucy";
person2.age=18;
if(person1.age<1||person1.age>100){
person1.age=1;
}
System.out.println(person2.name+person2.age+"岁");
}
上述代码看到我们为了满足要求,需要在设置年龄属性和输出时需要增加重复的代码判断逻辑;
如果我们用封装原则private
去修饰,通过public
的get
和set
方法来维护年龄属性,则可以避免这些问题,实现代码如下:
public class Person {
public String name;
private int age;
public String getAge() {
return age+"岁";
}
public void setAge(int age){
if(age<1||age>100){
age=1;
}
this.age = age;
}
public static void main(String[] args) {
Person person1 = new Person();
person1.name="小明";
person1.setAge(120);
System.out.println(person1.name+person1.getAge());
Person person2 = new Person();
person2.name="小红";
person2.setAge(18);
System.out.println(person2.name+person2.getAge());
}
}
上面实例里我们只是对age
属性私有化处理了,而实际项目里全用private
修饰,一是遵循封装原则保持统一,二是因为项目中我们经常需要实体相互转换,相关工具包都是依赖属性public
的get
和set
方法来实现的;
小结
封装
是面向对象编程的重要特性之一,适当的封装可以让我们的代码更加安全,高效和易于维护,实际开发中我们应当始终遵循这一原则。
实际项目开发中全是纯粹的get和set,校验和返现也不会这些写在数据实体里处理啊!
那是因为我们大多数开发都使用的基于贫血模型的MVC架构模式
,这其实是我们使用面向对象编程语言
在进行面向过程编程
开发。