如果在java中,Getter/Setter在编译时被替换;他们的目的如何实现?

如果在java中,Getter/Setter在编译时被替换;他们的目的如何实现?,java,properties,getter-setter,Java,Properties,Getter Setter,我是java新手。 我一直在读关于Getter/Setter(和)的书。 当我读甲骨文的时候。 我有两个问题如下: 我的问题是,如果JIT在编译代码时用实际值替换某些getter/setter, 如何实现getter/setter的目标 我们将如何实现封装 您混淆了两种不同的“编译时间”(这很容易做到) 我们通常所指的“编译时”是:当源代码文本转换成字节码时。但是JIT(即时编译器)发生在运行时 封装之所以发生,是因为任何使用类的代码都只能看到getter和setter。然后JIT可以内联这些g

我是java新手。 我一直在读关于Getter/Setter(和)的书。 当我读甲骨文的时候。 我有两个问题如下:

我的问题是,如果JIT在编译代码时用实际值替换某些getter/setter, 如何实现getter/setter的目标


我们将如何实现封装

您混淆了两种不同的“编译时间”(这很容易做到)

我们通常所指的“编译时”是:当源代码文本转换成字节码时。但是JIT(即时编译器)发生在运行时

封装之所以发生,是因为任何使用类的代码都只能看到getter和setter。然后JIT可以内联这些getter和setter,但这是运行时优化,而不是代码可以使用的

考虑一种常见模式,其中setter是私有的,getter是公共的:

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
字段

如果JIT在编译代码时用实际值替换某些getter/setter,那么在java中如何实现getter/setter的目的呢

因为这只是一个优化。getter和setter仍然完全按照预期工作——如果以后更改实现以使用不同的字段或其他机制,JIT编译器也必须更改其转换代码的方式

在大多数情况下,关于程序设计的推理根本不应该关心JIT编译器——这是关于程序如何执行的实现细节。您可能希望偶尔关注它以获得更好的性能,但它不会改变您的程序设计是否仍然有效


仅仅因为JIT可以编译使用getter直接有效地获取字段的代码,并不意味着自己公开字段是合适的——这将公开实现细节,使得以后很难更改。如果您更改了使JIT编译的代码以后无效的内容,这无关紧要,因为当您运行新代码时,JIT编译器无论如何都不会知道它对旧代码做了什么。

JIT是针对编译器的,而getter/setter是针对程序员的。
即使JIT会出于性能原因进行这样的更改,我们仍然可以在编码时利用getter/setter

谢谢大家编辑和回答这个问题。