gpt4 book ai didi

java - 为什么对不可变的最终实例变量使用 private 修饰符?

转载 作者:行者123 更新时间:2023-12-02 00:56:29 28 4
gpt4 key购买 nike

我正在编写一个代表一些简单几何形状的 Java 类。

最上面abstract类(它本身是包私有(private))我已经声明了需要从同一包中的子类访问的属性。

如果我将属性声明为 finalAbstractClass ,

final int foo;

我可以直接在包中访问它,而无需使用 getter 方法。然而。按照“实践”(或者我认为是常见的风格)进行操作将是:

private final int foo;

这当然需要一个非 private setter/getter 。子类必须引用 foo (这是一个非常相关且典型的属性)就好像它是某个外部对象一样:

this.getFoo();

它添加了代码并删除了访问这些成员的直接方式(即 foo )。

跳过private有什么缺点吗?修饰符,因为它们无论如何都是最终的,而且我不担心在包内部公开这些属性?

我知道 OO 拥护者声称 getter/setter 是对象访问其自身属性的一种非常自然的方式 - 但是什么时候这会变得不美观、不[插入任何 JavaBeans 风格的东西],区别?

考虑一个内部类,Coordinate ,这很简单,因为它有两个 int属性 - 保留类 OuterClass 的所有用法:

class OuterClass{
final static class Coordinate{
final int x, y;
Coordinate(int x, int y){
this.x = x;
this.y = y;
}
}
Coordinate coordinate;
}

对于这个内部类 - 为什么我要为创建 getter 的实践而烦恼?getter 会引入更多代码并强制同一包中的任何类调用 coordinate.getX();而不是简单地coordinate.x; 。这里有任何开销吗?请注意final类上的修饰符 Coordinate .

最佳答案

getter 的优点是将接口(interface)与实现解耦。今天,您的 getFoo 可能除了返回 foo 之外什么都不做,但将来您可能想要远程操作 foo 成员并返回而是计算结果。 getter 将允许您做到这一点,而无需在每个调用站点进行更改。

关于java - 为什么对不可变的最终实例变量使用 private 修饰符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13557384/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com