相关疑难解决方法(0)

为什么最终对象可以修改?

我在我正在处理的代码库中遇到以下代码:

public final class ConfigurationService {
    private static final ConfigurationService INSTANCE = new ConfigurationService();
    private List providers;

    private ConfigurationService() {
        providers = new ArrayList();
    }

    public static void addProvider(ConfigurationProvider provider) {
        INSTANCE.providers.add(provider);
    }

    ...
Run Code Online (Sandbox Code Playgroud)

INSTANCE被宣布为final.为什么可以添加对象INSTANCE?不应该使final的使用无效.(它没有).

我假设答案必须用指针和内存做一些事情,但我想肯定知道.

java final

82
推荐指数
6
解决办法
5万
查看次数

最终的ArrayList是什么意思?

通过使ArrayList(或其他Collection)最终获得哪些优点/缺点?我仍然可以添加ArrayList新元素,删除元素并更新它.但是什么影响使它成为最终的?

java final arraylist

61
推荐指数
5
解决办法
6万
查看次数

Java final修饰符

有人告诉我,我误解了final.的影响.final关键字有什么影响?

以下简要概述了我的想法,我知道:

Java final修饰符(又称聚合关系)

原始变量:只能设置一次.(内存和性能增益)
对象变量:可以修改,最终适用于对象引用.
字段:只能设置一次.
方法:不能被覆盖,隐藏.
课程:不能扩展.
垃圾收集:将强制Java世代垃圾收集标记扫描双扫.

Can's和Cant's

  • 可以使克隆失败(这既好又坏)
  • 可以使不可变的原语aka const
  • 可以使空白不可变 - 在创建时初始化也称为readonly
  • 可以使对象浅不可变
  • 可以使范围/可见性不可变
  • 可以使方法调用开销更小(因为它不需要虚拟表)
  • 可以使方法参数用作final(即使你不是)
  • 可以使对象线程安全(如果对象被定义为final,它不会使方法参数最终)
  • 可以进行模拟测试(不是你可以对它做任何事情 - 你可以说错误是有意的)
  • 不能交朋友(与其他朋友互相变化,休息不变)
  • 以后不能将变为不可变的变量(但可以像工厂模式一样修复)
  • 无法使数组元素成为不可变的,也是不可变的
  • 无法创建对象的新实例(这既好又坏)
  • 无法进行序列化工作

没有替代品final,但有包装+私人和枚举.

java final

54
推荐指数
1
解决办法
3万
查看次数

使用final关键字声明List字段

如果我在Synapse一个抽象类型的类中有以下语句:

private final List<Synapse> synapses;
Run Code Online (Sandbox Code Playgroud)

是否final允许我仍然能够更改Synapse对象的状态List,但是阻止我将新Synapse对象添加到列表中?如果我错了,你能否解释一下我final在做什么以及什么时候应该使用关键字final.

java final list

15
推荐指数
3
解决办法
2万
查看次数

标签 统计

final ×4

java ×4

arraylist ×1

list ×1