工作中实体类的属性为什么全用private修饰?
2024-12-30 09:51 阅读(142)

封装是什么

封装是面向对象编程的基本原则,官方说封装就是把对象的属性和行为(或方法)结合为一个独立的整体,并隐藏对象的内部实现细节。

什么意思呢?

前半句对象的属性和行为(或方法)结合为一个独立的整体就是指我们面向对象抽象出来的类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方法来实现的;

小结

封装是面向对象编程的重要特性之一,适当的封装可以让我们的代码更加安全,高效和易于维护,实际开发中我们应当始终遵循这一原则。

有JY可能会想,实际项目开发中全是纯粹的get和set,校验和返现也不会这些写在数据实体里处理啊!

那是因为我们大多数开发都使用的基于贫血模型的MVC架构模式,这其实是我们使用面向对象编程语言在进行面向过程编程开发,感兴趣的JYM可以评论交流!


作者:JavaCool

链接:https://juejin.cn