相关疑难解决方法(0)

如何在Java中创建不可变对象?

如何在Java中创建不可变对象?

应该将哪些对象称为不可变?

如果我有所有静态成员的类是不可变的?

java immutability

80
推荐指数
6
解决办法
8万
查看次数

必须是不可变对象的所有属性都是最终的吗?

必须是不可变对象的所有属性都是final

据我说不.但我不知道,我是否正确.

java final immutability java-memory-model

49
推荐指数
5
解决办法
1万
查看次数

如何在java中使对象不可变

由于这是当前的一个热门话题,我无法理解某些概念.请原谅我,如果我听起来很愚蠢,但当我尝试创建不可变对象的大部分帖子时,我发现了以下几点

  • 让课堂决赛 - 有意义
  • 不要让mutators(setter)用于属性 - 这是有道理的
  • 将属性设为私有 - 有意义

现在我无法理解为什么我们需要以下几点

  • 使构造函数私有,并提供与构造函数或工厂方法相同属性的createInstance方法?它有什么用?
  • 使属性最终 - 帖子的帖子无法解释这一点和我阅读的一些地方,以避免意外修改.如果没有变异器并且课程是最终的,你怎么能意外修改?如何使属性最终得到帮助?
  • 我可以使用构建器模式而不是工厂模式吗?

我在这里添加我的课程和测试用例:

    public final class ImmutableUser {
    private final UUID id;
    private final String firstName;
    private final String lastName;

    public ImmutableUser(UUID id, String firstName, String lastName) {
        super();
        this.id = id;
        this.firstName = firstName;
        this.lastName = lastName;
    }
    /**
     * @return the id
     */
    public UUID getId() {
        return id;
    }
    /**
     * @return the firstName
     */
    public String getFirstName() {
        return firstName;
    }
    /** …
Run Code Online (Sandbox Code Playgroud)

java immutability

14
推荐指数
3
解决办法
3164
查看次数

Java 中的不可变关键字是个好主意吗?

一般来说,我在 Java 中使用不可变对象的次数越多,我就越认为它们是一个好主意。从自动线程安全到无需担心克隆或复制构造函数,它们有很多优点。

这让我想到,“不可变”关键字会出错吗?显然,在语言中添加另一个保留字有一些缺点,我怀疑这主要是由于上述原因而实际上会发生 - 但忽略了我真的看不到很多缺点。

目前必须非常小心以确保对象是不可变的,即使这样,一个狡猾的 javadoc 评论声称一个组件对象是不可变的,而实际上它是不可变的,这可能会破坏整个事情。还有一种说法是,即使像字符串这样的基本对象也不是真正不可变的,因为它们很容易受到反射攻击。

如果我们有一个不可变的关键字,编译器肯定可以递归检查并给出一个铁一般的保证,即一个类的所有实例都是不可变的,这是目前无法做到的。尤其是随着并发越来越多,我个人觉得给这个效果加个关键字比较好。但是是否有任何我遗漏的缺点或实现细节使这成为一个坏主意?

java immutability keyword

4
推荐指数
1
解决办法
1488
查看次数

如何在初始化后将Java对象设置为final

我有一个对象:

Object obj = create();
Run Code Online (Sandbox Code Playgroud)

...我需要设置此Object的一些属性:

obj.setParam("7696969", 0x506);
Run Code Online (Sandbox Code Playgroud)

在此过程之后,我需要确保obj无法修改.

有没有办法设置objfinal不创建另一个final Object副本obj

java

2
推荐指数
1
解决办法
2207
查看次数

将相同的对象添加到Java中的List

为什么当我将相同的对象添加到列表时:

Integer a = new Integer(0);
testList.add(a);
a += 1;
testList.add(a);
Run Code Online (Sandbox Code Playgroud)

第一个没改变?

java

1
推荐指数
2
解决办法
144
查看次数

标签 统计

java ×6

immutability ×4

final ×1

java-memory-model ×1

keyword ×1