为什么 java 在 jvm public 中保留长度字段
Why has java kept length field in the jvm public
这是一个例子:
int[] a = {10};
int x = a.length;
我们不停地阅读以隐藏变量和使用访问器。为什么这里违反了这条规则?
一个更大的问题是;为什么 int[]
没有 class 文件?没有这样的 class 文件,就没有地方可以放置这样的方法,所以它纯粹是一种语言特性。它看起来像 int[]
的字段,但实际上不是。他们本可以让它看起来像一个方法调用,但他们没有这样做,因为它是一个不可变的字段。
如果你运行这个
public static void main(String[] args) throws NoSuchFieldException {
Field length = args.getClass().getDeclaredField("length");
它抛出一个 NoSuchFieldException
,因为它不像 class
中的字段,而是看起来像一个字段。
We read incessantly to hide variables and use accessors.
这并不总是必要的,在这种情况下,没有任何好处,只会提高一致性。
根据 Java 文档,数组的长度是最终字段。这意味着没有人可以修改它,因此没有必要为其提供 setter。
现在因为没有人可以修改它,所以没有必要将该字段设为私有并为其提供 getter。一个getter函数会再次被加载到RAM内存中的函数栈中,每次都会调用它来获取数组的大小。因此,为了提高性能,将数组的 'length' 作为 public 字段是有意义的。
另一方面,集合class中提供了一个'size()'方法。这是有道理的,因为内部方法可以分配更多内存并更改 Collections 的大小。
我们不会不断地隐藏变量和使用访问器。如果提供 getter/setter 有意义,那么我们应该将字段设为私有并为此提供 getter/setter。
使用访问器的一个可能的挫折是,如果有一天需要更改访问器的 return 类型。所有使用accessor方法的代码都会遇到问题
class MyClass{
private int val;
public int getVal(){
return val;
}
}
想象有一天 getVal() 的 return 类型需要更改(例如更改为 long
)。对于所有使用 getVal() 的程序来说,这是一个可能的问题,因为他们一直期望它是 int
.
类型
这是一个例子:
int[] a = {10};
int x = a.length;
我们不停地阅读以隐藏变量和使用访问器。为什么这里违反了这条规则?
一个更大的问题是;为什么 int[]
没有 class 文件?没有这样的 class 文件,就没有地方可以放置这样的方法,所以它纯粹是一种语言特性。它看起来像 int[]
的字段,但实际上不是。他们本可以让它看起来像一个方法调用,但他们没有这样做,因为它是一个不可变的字段。
如果你运行这个
public static void main(String[] args) throws NoSuchFieldException {
Field length = args.getClass().getDeclaredField("length");
它抛出一个 NoSuchFieldException
,因为它不像 class
中的字段,而是看起来像一个字段。
We read incessantly to hide variables and use accessors.
这并不总是必要的,在这种情况下,没有任何好处,只会提高一致性。
根据 Java 文档,数组的长度是最终字段。这意味着没有人可以修改它,因此没有必要为其提供 setter。
现在因为没有人可以修改它,所以没有必要将该字段设为私有并为其提供 getter。一个getter函数会再次被加载到RAM内存中的函数栈中,每次都会调用它来获取数组的大小。因此,为了提高性能,将数组的 'length' 作为 public 字段是有意义的。
另一方面,集合class中提供了一个'size()'方法。这是有道理的,因为内部方法可以分配更多内存并更改 Collections 的大小。
我们不会不断地隐藏变量和使用访问器。如果提供 getter/setter 有意义,那么我们应该将字段设为私有并为此提供 getter/setter。
使用访问器的一个可能的挫折是,如果有一天需要更改访问器的 return 类型。所有使用accessor方法的代码都会遇到问题
class MyClass{
private int val;
public int getVal(){
return val;
}
}
想象有一天 getVal() 的 return 类型需要更改(例如更改为 long
)。对于所有使用 getVal() 的程序来说,这是一个可能的问题,因为他们一直期望它是 int
.