首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么不公开所有字段/属性/方法?

为什么不公开所有字段/属性/方法?

在面向对象编程中,我们通常会遇到这样一个问题:在设计类时,如何决定哪些字段/属性/方法应该被公开,哪些应该被保护或私有。这主要涉及到软件设计中的封装、继承和多态等原则。

  1. 封装:封装是指将数据和操作数据的方法组合在一个类中,从而隐藏了内部实现的细节。这样可以避免外部代码直接访问和修改类的内部状态,减少了代码的复杂性和出错的可能性。
  2. 继承:继承是指一个类可以从另一个类继承属性和方法,从而实现代码的复用。当一个类继承另一个类时,它可以访问父类的公开属性和方法,但不能直接访问父类的私有属性和方法。
  3. 多态:多态是指同一个方法可以在不同的类中具有不同的实现,从而实现不同的行为。多态可以通过接口或抽象类来实现,这也是面向对象编程的一个重要特性。

总之,不公开所有字段/属性/方法的原因在于保护内部实现的细节,避免外部代码直接访问和修改类的内部状态,从而提高代码的可维护性和可扩展性。同时,这也符合面向对象编程中的封装、继承和多态等原则。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

为什么要用Getter和Setter方法,而不是公开属性

大多数字段的访问都是通过Getter和Setter方法来间接访问,为什么直接将字段设置为公开属性Public呢?答案在于前者的未来可能性。...为什么要这么写呢?为什么直接用Public呢?这对我来说是个奇怪的语法。 ?...使用Public属性与通过Getter和Setter公开它的主要区别在于保持对该属性的控制。如果你把一个字段公开,就意味着你可以直接访问调用方。然后,调用者可以做任何事情与你的领域,无论是有意或无意。...我们只返回并设置字段,就像公开字段一样。那你为什么要说这些?...但是,当一个字段没有这样的验证约束时,为什么要麻烦写一个Getter和Setter?我可以简单地公开它。 根据我的理解,问题的症结在于避免使代码变得不必要的复杂。

2.2K10

为什么Spring推荐@Autowired用于字段注入?

然而,尽管@Autowired注解让依赖注入变得如此简单,Spring官方却明确推荐在字段上使用它进行注入。那么,为什么会这样?今天,我们就来深入探讨一下这个问题。...System.out.println(userRepository.findAll()); } } 这种问题在开发过程中非常常见,特别是当类的构造函数或@PostConstruct方法中需要访问这些依赖时...为什么Spring推荐构造器注入?既然字段注入存在这么多问题,Spring官方为什么推荐构造器注入呢?这里有几个原因: 增强代码的可读性和维护性 构造器注入使得类的依赖关系一目了然。...构造器注入也意味着所有的依赖都是显式传入的,因此不会因为依赖的缺失或注入顺序的问题而导致运行时错误。 避免循环依赖 虽然构造器注入可以避免许多字段注入的问题,但它仍然可能引发循环依赖的问题。...notificationService); } @Test void testRegisterUser() { // 测试 UserService 的 registerUser 方法

12210
  • WPF 依赖属性绑定上调试方法

    ,而这个属性是从别的类复制过来的,此时你需要小心是不是没改全 表现:修改了值但是没有触发绑定变化,或者没有触发界面变化 调试方法:给属性添加一个 PropertyChangedCallback 添加断点...可以通过监听依赖属性的修改拿到在哪个地方修改了值 通过 DependencyPropertyDescriptor.FromProperty 方法可以拿到依赖属性修改的方法,使用下面代码拿到文本属性被修改...没有上下文,可以通过实时可视化树找到元素的上下文看绑定的是哪个类 如我看到了 TextBlock 的上下文实际上是主窗口而不是期望绑定的类,那么就知道为什么没有绑定上 ?...这个方法会用在列表里面的元素和用户控件绑定上,因为在列表和用户控件里面的上下文可能不是上层元素的上下文而是被指定的,请看WPF Frame 的 DataContext 不能被 Page 继承 没有通知...如果绑定的是普通的 CLR 类,那么需要这个类继承 INotifyPropertyChanged 然后在每个需要通知的属性上面调用通知方法 以下是标准写法,在属性修改的时候调用事件通知

    1.6K20

    为什么推荐使用BeanUtils属性转换工具

    1 背景 之前在专栏中讲过“推荐使用属性拷贝工具”,推荐直接定义转换类和方法使用 IDEA 插件自动填充 get / set 函数。...推荐的主要理由是: 有些属性拷贝工具性能有点差 有些属性拷贝工具有“BUG” 使用属性拷贝工具容易存在一些隐患(后面例子会讲到) 2 示例 首先公司内部就遇到过 commons 包的 BeanUtils...打断点可以看到,属性拷贝之后 B 类型的 second 对象中 ids 仍然为 Integer 类型: ? 如果转换为字符串,直接进行打印,并不会报错。...之前对各种属性映射工具的性能进行了简单的对比,结果如下: ?...因此慎用属性转换工具,如果可能建议自定义转换类,使用 IDEA插件自动填充,效率也挺高, A 或 B 中任何属性类型匹配,甚至删除一个属性,编译阶段即可报错,而且直接调用 get set 的效率也是非常高的

    1.6K30

    为什么推荐使用BeanUtils属性转换工具

    1 背景 之前在专栏中讲过“推荐使用属性拷贝工具”,推荐直接定义转换类和方法使用 IDEA 插件自动填充 get / set 函数。...推荐的主要理由是: 有些属性拷贝工具性能有点差 有些属性拷贝工具有“BUG” 使用属性拷贝工具容易存在一些隐患(后面例子会讲到) 2 示例 首先公司内部就遇到过 commons 包的 BeanUtils...打断点可以看到,属性拷贝之后 B 类型的 second 对象中 ids 仍然为 Integer 类型: 如果转换为字符串,直接进行打印,并不会报错。...如果我们在 A 类中添加一个 String number 属性,在 B 类中添加一个 Long number 属性,使用 mapstruect 当 number 设置为非数字类型时就会报 .NumberFormatException...之前对各种属性映射工具的性能进行了简单的对比,结果如下: 因此慎用属性转换工具,如果可能建议自定义转换类,使用 IDEA插件自动填充,效率也挺高, A 或 B 中任何属性类型匹配,甚至删除一个属性

    78820

    为什么建议使用 @Autowired 字段注入却还可以使用 @Resource

    前言hello,大家好,我是 Lorin,大家使用 Spring 框架 @Autowired 注解字段注入时是不是经常遇到这个问题,今天我们来看看为什么?...DependencyB dependencyB) { this.dependencyA = dependencyA; this.dependencyB = dependencyB; }}为什么推荐...无法实现像构造器注入不可变对象使用字段注入的依赖对外部不可见容易使对象违反单一职责原则由于字段注入使用过于简单,容易使对象过分膨胀,违反单一职责原则。...适用对象:@Autowired可以对构造器、方法字段使用,@Resource只能对方法字段使用。...@Resource 为什么没有推荐其实这是因为 @Autowired 是 Spring 提供的特定注解,和 Spring 框架绑定,而 @Resource 是JSR-250提供的,它是Java标准,作为

    93410

    为什么推荐使用 stop、suspend 方法中断线程?

    java版本中已经被标记上了@Deprecated过期标签,那么为什么她们曾经登上了java的历史舞台而又渐渐的推出了舞台呢?...我们从中可以看出以下几点: stop这种方法本质上是不安全的 使用Thread.stop停止线程会导致它解锁所有已锁定的监视器,即直接释放当前线程已经获取到的所有锁,使得当前线程直接进入阻塞状态 我们举例来看一下上边提到的两点...t1的执行,释放了t1线程获取到的所有锁,中断后t2获取到了o1和o2锁,开始执行直到结束,而t1却夭折在了sleep的时候,sleep后的代码没有执行。...那么建议使用stop中断线程我们应该怎么去优雅的结束一个线程呢,我们可以存java开发者的注释中窥探到一种解决方案: Many uses of stop should be replaced by code...二、suspend的落幕 suspend方法的作用是挂起某个线程直到调用resume方法来恢复该线程,但是调用了suspend方法后并不会释放被挂起线程获取到的锁,正因如此就给suspend和resume

    53920

    为什么推荐使用 stop、suspend 方法中断线程?

    我们知道像stop、suspend这几种中断或者阻塞线程的方法在较高java版本中已经被标记上了@Deprecated过期标签,那么为什么她们曾经登上了java的历史舞台而又渐渐的推出了舞台呢?...我们从中可以看出以下几点: stop这种方法本质上是不安全的 使用Thread.stop停止线程会导致它解锁所有已锁定的监视器,即直接释放当前线程已经获取到的所有锁,使得当前线程直接进入阻塞状态 我们举例来看一下上边提到的两点...可以看到,当线程t1在获取到o1和o2两个锁开始执行,在还没有执行结束的时候,主线程调用了t1的stop方法中断了t1的执行,释放了t1线程获取到的所有锁,中断后t2获取到了o1和o2锁,开始执行直到结束...那么建议使用stop中断线程我们应该怎么去优雅的结束一个线程呢,我们可以存java开发者的注释中窥探到一种解决方案: Many uses of stop should be replaced by code...二、suspend的落幕 suspend方法的作用是挂起某个线程直到调用resume方法来恢复该线程,但是调用了suspend方法后并不会释放被挂起线程获取到的锁,正因如此就给suspend和resume

    80130

    class 文件浅析 .class文件格式详解 字段方法属性常量池字段 class文件属性表 数据类型 数据结构

    比如 类的全限定名  类的属性信息 访问权限等 字段的名称 类型信息 访问权限等 方法的名称 方法签名 返回值类型 访问权限等 类或者方法或者字段 有没有注解? 类的父类是什么?...static类变量或者非sttic的实例变量 不包括继承的 field_info fields[fields_count];//字段表 u2 methods_count;//方法个数 所有方法 但不包括继承而来的...和 ACC_VOLATILE  接口中所有字段都具有 ACC_PUBLIC  ACC_STATIC   ACC_FINAL  也可以设置ACC_SYNTHETIC  其他的都不行了 class文件详解之方法...class文件的ClassFile结构 字段的field_info 结构 方法的method_info结构 另外还有Code属性 以上四类都包含属性结构信息 所有属性表的梗概结构为...后面的类型所加的注解 记录在classFile结构体的这个属性里 比如某个字段声明中的类型 所加的全部注解记录在字段的对应属性里 记录了标注在对应类声明  字段声明 或者方法声明所使用的类型上面的注解

    1.4K20

    DOM 对象所有属性方法介绍,看这一篇就够了!

    images[] 返回对文档中所有 Image 对象引用。 links[] 返回对文档中所有 Area 和 Link 对象引用。 属性 属性 描述 body 提供对 元素的直接访问。...属性方法 下面的属性方法可用于所有 HTML 元素上: 属性 / 方法 描述 element.accessKey 设置或返回元素的快捷键。...属性方法 属性 / 方法 描述 attr.isId 如果属性是 id 类型,则返回 true,否则返回 false。 attr.name 返回属性的名称。...在 W3C DOM Core 中,Attr (attribute) 对象从 Node 对象继承所有属性方法。 在 DOM 4 中,Attr 对象不再从 Node 继承。...为了保证未来的代码安全,您应该避免在属性对象上使用节点对象的属性方法属性 / 方法 避免的理由 attr.appendChild() 属性没有子节点。

    89320

    dotnet C# 基础 为什么 GetHashCode 推荐只取只读属性字段做哈希值

    反过来则不然,允许有两个不相等的对象的 GetHashCode 是相等的 在重写 Equals 方法时,大部分时候都是自动生成的,如将类里面的所有字段属性都进行一一比较。...那在 GetHashCode 方法里面,所输出的哈希值的计算,是否也需要使用此类型的所有字段属性共同计算出来?...,所获取到的 GetHashCode 的值是不包括未来对非只读属性字段变更的防御的。...如果此时在 GetHashCode 里面,使用了非只读字段属性,将会挖一个坑。...也许某个逻辑变更了这些非只读字段属性的时候,影响了 GetHashCode 的返回值从而影响了哈希容器的行为 这就是为什么 ReSharper 警告不要在 GetHashCode 里面使用非只读字段属性进行制作哈希值的原因

    61520

    查询网站所有的子域名的方法 为什么要查询

    大家平时上网都是需要使用域名的,而其中有不少的用户都想要了解更多的关于域名和服务器信息,此时可能还会涉及到查询网站所有的子域名的操作。...image.png 如何进行域名查询 查询网站所有的子域名听起来有点复杂,但其实并不是特别难的事情,因为现如今已经有一些网站和工具可以提供此项服务了。...有的公司在一些域名平台上注册的,通常这些平台也可以提供查询服务,子域名越多,所需要的时间也会相应增加,不过并非所有的子域名都可以查出来,所以要根据自己的需要选择工具。...查询网站所有的子域名是有必要的,原因首先是子域名的数量如果是多个,那么很可能会存在漏洞,无法保障安全,所以搜集子域名的信息就需要被重视了。...以上就是关于查询网站所有的子域名的相关介绍,可见查询的途径绝非一种,但是否好用就见仁见智了,适合自己的才是最好的方式。

    6.2K20

    Browser 对象所有属性方法介绍,看这一篇就够了!

    注释:没有应用于 window 对象的公开标准,不过所有浏览器都支持该对象。 集合 集合 描述 frames[] 返回窗口中所有命名的框架。...除了上面列出的属性方法,Window 对象还实现了核心 JavaScript 所定义的所有全局属性方法。 Window 对象的 window 属性和 self 属性引用的都是它自己。...注释:没有应用于 navigator 对象的公开标准,不过所有浏览器都支持该对象。 集合 集合 描述 plugins[] 返回对文档中所有嵌入式对象的引用。...注释:没有应用于 screen 对象的公开标准,不过所有浏览器都支持该对象。 属性 属性 描述 availHeight 返回显示屏幕的高度 (除 Windows 任务栏之外)。...History 对象是 window 对象的一部分,可通过 window.history 属性对其进行访问。 注释:没有应用于 History 对象的公开标准,不过所有浏览器都支持该对象。

    80730

    如何解决mybatis-plus调用update方法时,自动填充字段生效问题

    前言 使用过mybatis-plus的朋友可能会知道,通过实现元对象处理器接口com.baomidou.mybatisplus.core.handlers.MetaObjectHandler可以实现字段填充功能...isInsert)); } else { /* * 非表映射类处理...),自动填充生效问题 通过源码分析我们得知,只要tableInfo不为空,则就会进入自动填充逻辑,而tableInfo不为空的前提是更新或者插入的实体不是null对象,因此我们的思路就是在调用update...方法时,要确保实体不为null 方案一:实体更新时,直接使用update(Wrapper updateWrapper)的重载方法boolean update(T entity, Wrapper<T...重写update的方法思路有如下 方法一:重写ServiceImpl的update方法 其核心思路如下,重写一个业务基类BaseServiceImpl public class BaseServiceImpl

    4.2K00

    JavaScript之面向对象学习二(原型属性对象与in操作符)获取对象中所有属性方法

    in操作符之for-in结合使用 在使用for-in循环时,返回的是所有能够通过对象访问的、可枚举的属性,既包括实例中的属性又包括原型对象中的属性; 注意:屏蔽了原型中不可枚举属性(即将[[Enumerable...false的[[Enumerable]]标记(所以该属性无法被循环),因此应该跳过该属性,所以我们就看不到警告框,所以该bug会影响默认不可枚举的所有属性方法,包括:hasOwnProperty()、...3、使用Object.keys()方法获取指定对象中所有可枚举的实例属性 ECMAScript 5中提供了Object.keys()方法。...这个方法接收一个对象作为参数,返回一个包含所有可枚举属性的字符串数组,代码如下: function Person(){ } Person.prototype.name="张三";...Person(); person.name="李四"; person.age=22; var personkeys=Object.keys(person); //获取person实例的属性包含其原型对象的属性

    1.6K90
    领券