为此选择了几种语言,例如C#,Java和Python.如果它旨在为比较等操作节省内存或提高效率,它对连接和其他修改操作有什么影响?
这是声明不可变结构的正确方法吗?
public struct Pair
{
public readonly int x;
public readonly int y;
// Constructor and stuff
}
Run Code Online (Sandbox Code Playgroud)
我想不出为什么这会遇到问题,但我只想问一下.
在这个例子中,我使用了int.如果我使用了一个类,但该类也是不可变的,就像这样呢?这应该也可以正常工作,对吧?
public struct Pair
{
public readonly (immutableClass) x;
public readonly (immutableClass) y;
// Constructor and stuff
}
Run Code Online (Sandbox Code Playgroud)
(旁白:据我所知,使用性能更加普及,并允许改变,但这种结构的目的是从字面上只存储两个值我在永恒的问题只是有兴趣在这里.)
我只是想知道为什么结构,字符串等是不可变的?是什么原因使它们成为不可变的,其余的对象是可变的.有什么东西被认为是使对象不可变的?
对可变和不可变对象分配和释放内存的方式有什么不同吗?
我已经阅读了几篇关于不变性的文章,但仍然没有很好地遵循这个概念.
我最近在这里提到了一个线程,提到了不变性,但由于这本身就是一个话题,我现在正在制作一个专门的线程.
我在过去的帖子中提到过,我认为不变性是将对象设为只读并使其可见性低的过程.另一位成员表示,这与此没有任何关系.此页面(系列的一部分)使用不可变类/结构的示例,它使用readonly和其他概念将其锁定.
在这个例子中,状态的定义究竟是什么?国家是一个我没有真正掌握的概念.
从设计指南的角度来看,一个不可变的类必须是一个不接受用户输入并且真的只返回值的类?
我的理解是,任何只返回信息的对象都应该是不可变的并且"锁定",对吧?因此,如果我想在具有该方法的专用类中返回当前时间,我应该使用引用类型,因为它将工作类型的引用,因此我受益于不变性.
我需要一个小的Container-Class来存储一些应该是不可变的字符串.由于String本身是一个不可变类型,我想到了类似的东西:
public final class Immu
{
public final String foo;
public final String bar;
public Immu(final String foo, final String bar)
{
this.foo = foo;
this.bar = bar;
}
}
Run Code Online (Sandbox Code Playgroud)
许多人似乎完全反对使用公共字段,而是使用Getters.恕我直言,在这种情况下,这只是样板,因为String本身是不可变的.
我可能在这个问题上缺少的其他想法?
我有一个我想在React中编写的函数.在我的课堂上,我有一个状态对象fields,如下所示:
this.state = {
step: 1,
fields: {
type: '',
name: '',
subtype: '',
team: '',
agreement: ''
}
};
Run Code Online (Sandbox Code Playgroud)
我有各种功能,使用immutability helper通常看起来像这样的键来分配这些键:
assignType(attribute) {
var temp = update(this.state.fields, {
type: {$set: attribute}
});
this.setState({
fields: temp
});
}
Run Code Online (Sandbox Code Playgroud)
我会喜欢做的是使用一个函数,更通用的,做这样的事情:
assignAttribute(field, attribute) {
var temp = update(this.state.fields, {
field: {$set: attribute}
});
this.setState({
fields: temp
});
}
Run Code Online (Sandbox Code Playgroud)
但是,这不起作用.使用变量键可以做什么immutability-helper?
Allen Holub写了以下内容,
如果没有一些耦合,你就无法拥有一个程序.尽管如此,您可以通过盲目地遵循OO(面向对象的)规则来最大限度地减少耦合(最重要的是对象的实现应该完全隐藏在使用它的对象之外).例如,对象的实例变量(非常量的成员字段)应始终为私有.期.没有例外.永远.我是认真的.(您可以偶尔有效地使用受保护的方法,但受保护的实例变量是令人厌恶的.)
这听起来很合理,但他继续说,
你不应该出于同样的原因使用get/set函数 - 它们只是过于复杂的方式使字段公开(尽管返回完整对象而不是基本类型值的访问函数在返回对象的情况下是合理的class是设计中的关键抽象).
坦率地说,这对我来说听起来很疯狂.
我理解信息隐藏的原理,但是如果没有访问器和更改器,你根本就不能使用Java bean.我不知道如何在模型中没有访问器的情况下遵循MVC设计,因为模型不能负责渲染视图.
但是,我是一名年轻的程序员,而且我每天都在学习更多关于面向对象设计的知识.也许拥有更多经验的人可以在这个问题上权衡.
我不确定为什么字符串和元组是不可变的; 使它们不可变的优点和缺点是什么?
我非常受Rich Hickey倡导的数据管理方法的启发,并在Datomic中实现,数据从未就地变异,所有版本始终保存和查询,时间是第一个 -阶级观念.
当然,有专门的数据库匹配该描述,如Git,或任何其他源控制系统.问题是,是否有任何(或多或少)通用DBMS-es的关系,图形,层次,文档或任何其他风格可以有效地用于,例如,电子商务Web应用程序.或者Datomic是唯一的选择呢?
必须是不可变对象的所有属性都是final?
据我说不.但我不知道,我是否正确.