如果Getter/Setter在编译时被替换为java;他们的目的如何才能实现?
If Getter/Setter are replaced at compile time in java; how can their purpose be fulfilled?
我是 java 的新手。
我一直在阅读有关 Getter/Setter (Why to use getter/setter and getter/setter poor design) 的内容。
当我阅读 Oracle Understanding JIT 时。
我有两个问题如下:
我的问题是,如果 JIT 在编译代码时将一些 getters/setters 替换为实际值,
getter/setter 的目的是如何实现的?
我们将如何实现封装?
您混淆了两个不同的 "compile times"(这很容易做到)。
我们通常所说的"compile time"字面意思就是:当源代码文本被转换成字节码时。但是 JIT(即时编译器)发生在 runtime.
封装发生是因为任何使用您的 class 的代码只能看到 getter 和 setter。 JIT 然后可以内联那些 getters 和 setters,但这是运行时优化,不是代码可以使用的东西。
考虑 setter 是私有的而 getter 是 public 的常见模式:
class Square {
int size;
public Square(int size) {
this.setSize(size);
}
private void setSize(size) {
this.size = size;
}
public int getSize() {
return this.size;
}
}
虽然 JIT(甚至主编译器)可以内联 setSize
,并且 JIT 可以内联 getSize
,但使用 Square
实例的代码不能以任何方式使用它修改 size
字段。
if JIT replaces some getters/setters with actual value while compiling a code how purpose of getter/setter is fulfilled in java particular ?
因为这只是一个优化。 getters 和 setter 仍然完全按预期工作 - 如果您稍后更改实现以使用不同的字段或某些其他机制,JIT 编译器也必须更改它转换代码的方式。
在大多数情况下,您对程序设计的推理根本不应该关心 JIT 编译器 - 这是关于您的程序如何执行的实现细节。您可能偶尔会关心它以获得更好的性能,但它不会改变您的程序设计是否仍然有效。
仅仅因为 JIT 可能 编译使用 getter 的代码来有效地直接获取字段并不意味着您自己公开该字段是合适的 -这会暴露一个实现细节,使得以后很难改变。如果您更改使 JIT 编译的代码稍后无效的内容,这无关紧要,因为当您成为 运行 新代码时,JIT 编译器将不知道它对旧代码做了什么无论如何代码。
JIT 用于编译器,而 getters/setters 用于程序员。
即使 JIT 会出于性能原因进行此类更改,我们仍然可以在编码时利用 getters/setters。
我是 java 的新手。 我一直在阅读有关 Getter/Setter (Why to use getter/setter and getter/setter poor design) 的内容。 当我阅读 Oracle Understanding JIT 时。 我有两个问题如下:
我的问题是,如果 JIT 在编译代码时将一些 getters/setters 替换为实际值, getter/setter 的目的是如何实现的?
我们将如何实现封装?
您混淆了两个不同的 "compile times"(这很容易做到)。
我们通常所说的"compile time"字面意思就是:当源代码文本被转换成字节码时。但是 JIT(即时编译器)发生在 runtime.
封装发生是因为任何使用您的 class 的代码只能看到 getter 和 setter。 JIT 然后可以内联那些 getters 和 setters,但这是运行时优化,不是代码可以使用的东西。
考虑 setter 是私有的而 getter 是 public 的常见模式:
class Square {
int size;
public Square(int size) {
this.setSize(size);
}
private void setSize(size) {
this.size = size;
}
public int getSize() {
return this.size;
}
}
虽然 JIT(甚至主编译器)可以内联 setSize
,并且 JIT 可以内联 getSize
,但使用 Square
实例的代码不能以任何方式使用它修改 size
字段。
if JIT replaces some getters/setters with actual value while compiling a code how purpose of getter/setter is fulfilled in java particular ?
因为这只是一个优化。 getters 和 setter 仍然完全按预期工作 - 如果您稍后更改实现以使用不同的字段或某些其他机制,JIT 编译器也必须更改它转换代码的方式。
在大多数情况下,您对程序设计的推理根本不应该关心 JIT 编译器 - 这是关于您的程序如何执行的实现细节。您可能偶尔会关心它以获得更好的性能,但它不会改变您的程序设计是否仍然有效。
仅仅因为 JIT 可能 编译使用 getter 的代码来有效地直接获取字段并不意味着您自己公开该字段是合适的 -这会暴露一个实现细节,使得以后很难改变。如果您更改使 JIT 编译的代码稍后无效的内容,这无关紧要,因为当您成为 运行 新代码时,JIT 编译器将不知道它对旧代码做了什么无论如何代码。
JIT 用于编译器,而 getters/setters 用于程序员。 即使 JIT 会出于性能原因进行此类更改,我们仍然可以在编码时利用 getters/setters。