繁体   English   中英

'public static final' 还是 'private static final' with getter?

[英]'public static final' or 'private static final' with getter?

在 Java 中,教导变量应该保持私有以实现更好的封装,但是 static 常量呢? 这个:

public static final int FOO = 5;

结果等同于:

private static final int FOO = 5;
...
public static getFoo() { return FOO; }

但哪种做法更好?

不在代码中直接使用常量是有原因的。

假设 FOO 以后可能会改变(但仍然保持不变),对public static final int FOO = 10; . 只要没有人愚蠢到直接对值进行硬编码,就不应该破坏任何东西吗?

不会。 Java 编译器会将上述 Foo 等常量内联到调用代码中,即someFunc(FooClass.FOO); 变成someFunc(5); . 现在,如果您重新编译您的库而不是调用代码,您可能会遇到令人惊讶的情况。 如果您使用 function 就可以避免这种情况——JIT 仍会对其进行优化,因此不会影响真正的性能。

由于 final 变量以后不能更改,如果您要将它用作全局常量,只需将其公开即可,不需要 getter。

Getter 在这里毫无意义,很可能会被 JVM 内联。只需坚持公共常量。

封装背后的想法是保护变量的不需要的更改并隐藏内部表示。 对于常量,它没有多大意义。

使用 class 之外的变量作为:

public def FOO:Integer = 5; 

如果封装不是您的首要任务。 否则使用第二个变体,以便公开方法而不是变量。

private static final int FOO = 5;
...
public static getFoo() { return FOO; }

代码维护不依赖变量也是一种更好的做法。 请记住“过早的优化是万恶之源”。

第一个如果 getFoo 结果是恒定的并且不需要在运行时评估。

我会继续使用 getFoo(),因为它允许您在将来更改实现而无需更改客户端代码。 正如@Tomasz 指出的那样,JVM 可能会内联您当前的实现,因此您付出了很大的性能损失。

在成员上使用 setter 和 getter 的优点是能够覆盖。 这对 static “方法”(而不是功能)无效

也没有办法定义接口 static 方法。

我会 go 与现场访问

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM