首页
学习
活动
专区
圈层
工具
发布

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

大多数字段的访问都是通过Getter和Setter方法来间接访问,为什么不直接将字段设置为公开属性Public呢?答案在于前者的未来可能性。...我了解到,通过公共访问修饰符,类的一个字段对于任何包都是可访问的,并且使用getter/setter,我实际上正在做相同的事情——使字段私有化,而getter/setter方法是公共的,因此它可以被任何包访问...如果你把一个字段公开,就意味着你可以直接访问调用方。然后,调用者可以做任何事情与你的领域,无论是有意或无意。...设置值的惟一方法是通过Setter,通过Getter获得值,所以现在字段只有一个入口和一个出口点,因为Getter和Setter是允许代码块的方法,所以可以对它们进行验证检查!...这同样适用于Getter方法——您可以决定返回实际的引用或克隆它,并将其返回给调用者。 因此,Getter和Setter起到保险丝或断路器的作用,电流必须通过保险丝。

2.6K10

flink线程模型源码分析1之前篇将StreamTask中的线程模型更改为基于Mailbox的方法

使用mailbox模式,流任务中的所有状态更改都将从单个线程(即所谓的“mailbox线程”)发生。通过将操作(或至少其状态更改部分)排队到阻塞队列—邮箱,可以模拟并发操作。...这种方法可以极大地简化流任务的线程模型。下面我们将描述实现这一改变所面临的挑战和计划。 2....目前,检查点锁通过协作参与者的构造函数或getter公开给他们。我们巧妙地将邮箱隐藏在Queue接口(或类似的接口)之后,并通过传递给构造函数或通过getter返回来公开队列。...我们将讨论使用不同于其他流任务的source functions来执行流任务的一种可能的方法。...我们通过旧的检查点锁使两个线程互斥,这意味着我们运行一个修改版本的邮箱循环,该循环阻塞邮箱,并在检查点锁下执行邮箱事件(参见图)。

3.3K31
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    不学函数式设计的3大损失

    在多个线程同时访问座位信息时,使用这个getter可能会出现并发安全的bug。比如,一个线程通过这个getter,获取了seats列表的引用,并开始遍历它来查找可用座位。...副作用指一个函数或方法除了返回值之外,还对程序状态或外部世界产生了其他的影响。常见的副作用包括修改全局变量或静态变量、修改传入的参数、进行I/O操作(如文件读写、网络通信)、修改数据库和抛出异常。...图5 失误4:公开可变字段这样一改,当在进行并发支付处理时,就会有并发安全的风险。比如两个客服人员同时处理同一个订单的支付。...由于isPaid字段是公开的,一个线程可能正在检查支付状态时,另一个线程直接修改了isPaid的值。这可能导致重复支付或错误地将未支付的订单标记为已支付。...图10 对于失误3"在锁内部调用可能长时间阻塞的操作",不可变数据结构和无须显式加锁的atom能从根源上避免对于失误4"公开可变字段",函数的封装和不可变数据结构能从根源上避免对于失误4"公开可变字段"

    89554

    TW洞见〡getter和setter的那些事

    文章作者来自ThoughtWorks:佟达 相信每一个以Java或者C++作为编程入门语言的程序员,一定会记得一条金科玉律:字段(Filed)要声明成private,如果要读取或修改字段,就声明一些公开方法...但是,当你写了很多程序,写过很多getter和setter,尤其是有些类方法,只有getter和setter时,总会有一天,你会疑惑,我到底为什么要这么干? Why private field?...要解释为什么需要getter和setter,先要知道为什么字段应该是private的。 在汇编语言时,数据都是公开的。所谓公开,是指几乎任何指令,都可以作用在任意的数据块上。...那么直接将数据字段设置为public,与通过getter和setter方式来暴露字段,有什么区别? 面向对象编程中有一条非常重要的原则,就是面向接口(Interface)编程。...不过,因为这只是通过注解做的一种Hack,加了@Data注解,相当于编译器自动生成getter和setter,所以调用代码还是要用getId和getName这样的方法名来访问变量。

    1.3K60

    重磅!Apache Kafka 3.1.0正式发布!

    KIP 还向该类引入了一个新TaskId字段StreamsException,并使用 getter API 来公开它。为源自特定任务或与特定任务相关的任何异常设置此字段。...KIP-775通过扩展外键连接接口以允许传入自定义分区器,引入了对具有自定义分区器的表的外键连接的支持。...用户可以定期对该指标进行采样,并使用样本之间的差异来测量间隔内阻塞的时间。...KIP-690引入了新方法来ReplicationPolicy定义如何根据一些新配置命名 MM2 内部主题。...了解更多: 有关更改的完整列表,请参阅发行说明 查看视频或播客以了解更多信息 下载Apache Kafka 3.1.0以开始使用最新版本 这是一项巨大的社区努力,因此感谢为此版本做出贡献的每个人,包括我们所有的用户以及我们的

    2.2K31

    Scala 学习笔记之类

    (对于私有字段而言,getter和setter方法也是私有的)  在scala中getter和setter方法分别叫age和age_=.使用的时候如下: val p = new Person p.age...getter和setter方法听上去有些恐怖,不过你可以控制这个过程: 如果字段是私有的,则getter和setter方法也是私有的 如果字段是val,则只有getter方法被生成 如果你不需要任何的getter...= 22 } Scala会生成一个私有的final字段和一个getter方法,但没有setter方法 4....备注 对于类私有的字段(private),Scala会生成私有的getter和setter方法,但是对于对象私有的字段,不会生成getter和setter方法. 5....name 公有的name name_=(仅限var) 实现一个可以被公开访问并且背后是以字段形式保存的属性 @BeanProperty val/var name 公有的name getName() name

    59030

    Spring中国教育管理中心-Apache Cassandra 的 Spring 数据教程八

    打开投影 投影接口中的访问器方法也可用于通过使用@Value注释计算新值,如以下示例所示: 例 81....由 SpEL 表达式评估支持的方法也可以使用方法参数,然后可以从表达式中引用这些参数。方法参数可通过Object名为的数组获得args。以下示例显示了如何从args数组中获取方法参数: 示例 84....如果支持值是null,则 getter 方法返回所用包装器类型的空表示。 基于类的预测 (DTO) 定义投影的另一种方法是使用值类型 DTO(数据传输对象),这些 DTO 包含应该检索的字段的属性。...如果存储通过限制要加载的字段来优化查询执行,则要加载的字段由公开的构造函数的参数名称确定。 以下示例显示了一个投影 DTO: 例 86....private final默认的,并且该类公开了一个构造函数,该构造函数接受所有字段并自动获取equals(…)和hashCode()实现方法。

    1K30

    QUIC协议原理浅解

    HTTP 协议发展 (1)HTTP历史进程 HTTP 0.9(1991年)只支持get方法不支持请求头; HTTP 1.0(1996年)基本成型,支持请求头、富文本、状态码、缓存、连接无法复用; HTTP...; --HTTP 1.1:默认支持长连接(请求可复用TCP连接);支持断点续传(通过在 Header 设置参数);优化了缓存控制策略;管道化,可以一次发送多个请求,但是响应仍是顺序返回,仍然无法解决队头阻塞的问题...同一域名只需占用一个 TCP 连接,通过数据流(Stream)以帧为基本协议单位,避免了因频繁创建连接产生的延迟,减少了内存消耗,提升了使用性能,并行请求,且慢的请求或先发送的请求不会阻塞其他请求的返回...无队头阻塞 (1)TCP的队头阻塞问题 虽然 HTTP2 实现了多路复用,但是因为其基于面向字节流的 TCP,因此一旦丢包,将会影响多路复用下的所有请求流。...TCP 队头阻塞的主要原因是数据包超时确认或丢失阻塞了当前窗口向右滑动,我们最容易想到的解决队头阻塞的方案是不让超时确认或丢失的数据包将当前窗口阻塞在原地。

    4.8K41

    Spring认证中国教育管理中心-Apache Geode 的 Spring 数据教程二十一

    为此,我们使用以下算法: 如果属性是不可变的但公开了一个with…方法(见下文),我们使用该with…方法创建一个具有新属性值的新实体实例。...如果定义了属性访问(即通过 getter 和 setter 访问),我们将调用 setter 方法。 如果属性是可变的,我们直接设置字段。...该comment属性是可变的,通过直接设置其字段来填充。...的remarks特性是可变的,并且通过设置填充comment直接字段或通过调用用于setter方法 该类公开了一个工厂方法和一个用于创建对象的构造函数。...确保遵守允许使用生成的实例化器和属性访问器类的约束 ——  对于要生成的标识符,仍然使用 final 字段与全参数持久性构造函数(首选)或with…方法相结合 ——  使用 Lombok 避免样板代码

    1.3K30

    什么是线程安全以及如何实现它-Java快速进阶教程

    线程本地字段 在面向对象编程(OOP)中,对象实际上需要通过字段维护状态,并通过一个或多个方法实现行为。...如果我们确实需要维护状态,我们可以通过使它们的字段为线程本地来创建线程安全类,这些类不会在线程之间共享状态。 我们可以通过简单地在Thread类中定义私有字段来轻松创建字段为线程本地的类。...同样,我们可以通过将ThreadLocal实例分配给字段来创建线程本地字段。...,不同之处在于通过 setter/getter 访问它们的每个线程都会获得该字段的独立初始化副本,以便每个线程都有自己的状态。...简单地说,一次只有一个线程可以访问同步方法,同时阻止其他线程访问此方法。其他线程将保持阻塞状态,直到第一个线程完成或该方法引发异常。

    35510

    2018年不能错过的 14 个 Java 库!

    @Cleanup - 自动资源管理:安全地调用您的close()方法,没有麻烦。 @Getter / @Setter - 不要再写public int getFoo(){return foo;}。...@Data - 现所有字段上都有@ToString,@EqualsAndHashCode,@Getter的快捷方式,所有非final字段的@Setter和@RequiredArgsConstructor...JUnitParams 与标准JUnit的主要区别: 更明确 - params是在测试方法参数中,而不是类字段 更少的代码 - 你不需要一个构造函数来设置参数 您可以在一个类中混合使用非参数方法的参数...参数可以作为CSV字符串或参数提供程序类传递 参数提供程序类可以具有任意多个提供所需方法的参数,以便可以对不同的案例进行分组 你可以有一个提供参数的测试方法(不再有外部类或静态) 您可以在IDE中查看实际的参数值...WireMock 模拟HTTP服务的工具: HTTP响应stubbing存根,匹配HTTP的URL、头部和正文内容 请求验证 在单元测试中运行,作为独立进程或作为WAR应用程序运行 可通过流畅的Java

    1.9K10

    @Accessors 注解极简教程

    @Accessors 源码 我们打开 @Accessors 的源码可以看到: 1)该注解主要作用是:当属性字段在生成 getter 和 setter 方法时,做一些相关的设置。...@Accessors 属性说明 2.1 fluent 属性 不写默认为false,当该值为 true 时,对应字段的 getter 方法前面就没有 get,setter 方法就不会有 set。...2.3 prefix 属性 该属性是一个字符串数组,当该数组有值时,表示忽略字段中对应的前缀,生成对应的 getter 和 setter 方法。...那么,我们在生成的 getter 和 setter 方法如下,它也是带有 xx 和 yy 前缀的。...如果,我们把它的前缀加到 @Accessors 的属性值中,则可以像没有前缀那样,去调用字段的 getter和 setter 方法。

    87630

    IDEA中用好Lombok,撸码效率至少提升5倍

    来源:http://t.cn/EXhxRzV 以前的Java项目中,充斥着太多不友好的代码:POJO的getter/setter/toString;异常处理;I/O流的关闭操作等等,这些样板代码既没有技术含量.../@Setter: 作用类上,生成所有成员变量的getter/setter方法;作用于成员变量上,生成该成员变量的getter/setter方法。...@Setter private boolean funny; } } 在Structure视图中,可以看到已经生成了getter/setter等方法: ?...,可以通过of属性限定显示某些字段,通过exclude属性排除某些字段。...@SneakyThrows:可以对受检异常进行捕捉并抛出,可以改写上述的main方法如下: ? @Synchronized:作用于方法级别,可以替换synchronize关键字或lock锁,用处不大。

    55560

    IDEA 中用好 Lombok,撸码效率至少提升5倍

    作 者:LiWenD 来 源:http://t.cn/EXhxRzV 以前的Java项目中,充斥着太多不友好的代码:POJO的getter/setter/toString;异常处理;I/O流的关闭操作等等.../@Setter: 作用类上,生成所有成员变量的getter/setter方法;作用于成员变量上,生成该成员变量的getter/setter方法。...@Setter private boolean funny; } } 在Structure视图中,可以看到已经生成了getter/setter等方法: ?...,可以通过of属性限定显示某些字段,通过exclude属性排除某些字段。...@SneakyThrows:可以对受检异常进行捕捉并抛出,可以改写上述的main方法如下: ? @Synchronized:作用于方法级别,可以替换synchronize关键字或lock锁,用处不大。

    57120

    告别996,Java 这几个常用工具类库,建议收藏!

    设置对象属性值 populate:根据Map给属性复制 copyPeoperty:复制单个值,从一个对象到另一个对象 cloneBean:克隆bean实例 13 编码神器 lombok @Setter 注解在类或字段...,注解在类时为所有字段生成setter方法,注解在字段上时只为该字段生成setter方法。...@Getter 使用方法同上,区别在于生成的是getter方法。 @ToString 注解在类,添加toString方法。...@RequiredArgsConstructor 注解在类,为类中需要特殊处理的字段生成构造方法,比如final和被@NonNull注解的字段。...@Data 注解在类,生成setter/getter、equals、canEqual、hashCode、toString方法,如为final属性,则不会为该属性生成setter方法。

    1.5K20
    领券