初步说明:我在朱莉娅工作,但这个问题可能适用于许多语言.
设置:我有一个复合类型如下:
type MyType
x::Vector{String}
end
Run Code Online (Sandbox Code Playgroud)
我写了一些方法来采取行动MyType.例如,我编写了一个允许我插入新元素的方法x,例如function insert!(d::MyType, itemToInsert::String).
问题:应该MyType是可变的还是一成不变的?
我的理解:我已经阅读了关于这个的Julia文档,以及关于Stackoverflow的更一般(和高度投票)的问题(例如这里或这里),但我仍然没有很好地处理它意味着什么从实际角度看可变/不可变(特别是对于不可变复合类型的情况,包含可变类型的可变数组!)
尽管如此,这是我的尝试:如果MyType是不可变的,那么这意味着该字段x必须始终指向同一个对象.该对象本身(字符串的向量)是可变的,因此我可以在其中插入新元素.我不允许做的是尝试改变,MyType以便该字段x指向一个完全不同的对象.例如,执行以下操作的方法是可以的:
MyType.x[1] = "NewValue"
push!(MyType.x, "NewElementToAdd")
Run Code Online (Sandbox Code Playgroud)
但是执行以下操作的方法并不合适:
MyType.x = ["a", "different", "string", "array"]
Run Code Online (Sandbox Code Playgroud)
这是正确的吗?另外,是否认为不可变类型字段值被锁定的对象是在构造函数中创建的对象?
最后一点:如果这似乎与SO上的其他问题重复,我道歉.如上所述,我已经仔细研究过,并且无法理解我所追求的.
我经常碰到“线程安全”这两个关键术语,想知道这意味着什么。例如,在Firebase或Realm中,某些对象被视为“线程安全”。线程安全的东西到底意味着什么?
持久性无知是指能够允许开发人员以完全独立于基础结构服务(在本例中为实体框架)的基本要求和假设的方式编写和测试域对象.此类要求/假设通常包括:
- 需要实现特定的接口(例如,IPOCO)
- 从基类继承
- 提供特定的构造函数
- 对象实例化/构造要求 - 例如使用特定工厂**
- 需要元数据或映射类或属性属性
- 需要使用特定的关系机制
这相当于能够使用普通旧CLR对象(POCO),以便开发人员可以创建其域对象,而不受框架强加的所有假设和要求的影响.使用此方法,一旦域对象准备满意,开发人员就可以将这些类与实体框架一起使用,以便进行关系数据库访问和持久性.
截至目前(CTP5),有没有办法使用参数化构造函数重建poco?如果没有,很难看出实体框架如何被称为提供持久性无知.
domain-driven-design entity-framework poco code-first entity-framework-4
我有一个类,它有一个构造函数,其中所有参数都由GUICE注入.
Public class Order {
private final ClassOne classOneObj;
private final ClassTwo classTwoObj;
@Inject
public order(ClassOne classOneObj, ClassTwo classTwoObj){
this.classOneObj = classOneObj;
this.classTwoObj = classTwoObj;
}
}
Run Code Online (Sandbox Code Playgroud)
现在,我想再添加一个无法注入的字段(例如,int status)变量.
首先使用所有注入的参数创建对象然后设置无法使用setter方法注入的新字段是一个好习惯吗?
我提出了另一种方法,我创建了一个工厂类,如下所示:
public class OrderFactory {
private final ClassOne classOneObj;
private final ClassTwo classTwoObj;
@Inject
public order(ClassOne classOneObj, ClassTwo classTwoObj){
this.classOneObj = classOneObj;
this.classTwoObj = classTwoObj;
}
//getter methods for all the above variables
public ClassOne getclassOneObj(){
return classOneObj;
}
....
public Order createOrder(int status) {
return new Order(status, classOneObj, classTwoObj); …Run Code Online (Sandbox Code Playgroud) 我有小代码,如下面.我期望结果应该是7,但它打印出来6.如果我取消注释该行tmp.get(Calendar.MONTH),它将运行OK(打印7).
请让我知道原因.我在MacOS中使用JDK 1.7.0_25.
public static void main(String[] args) {
Calendar tmp = Calendar.getInstance();
tmp.set(Calendar.DAY_OF_MONTH, 4);
tmp.set(Calendar.MONTH, Calendar.AUGUST);
//tmp.get(Calendar.MONTH);
tmp.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
System.out.println(tmp.get(Calendar.MONTH));
}
Run Code Online (Sandbox Code Playgroud)
屏幕截图:
评论代码:http ://gyazo.com/4c099b1b2b90d72d1954b98b134e4ac3
取消注释代码:http://gyazo.com/fe368745da168646140ca9f3a60d2021
我是Python的新手,试图理解可变对象和不可变对象之间的区别。Python中的可变类型之一是列表。假设L = [1,2,3],则L具有指向对象[1,2,3]的ID。如果[1,2,3]的内容被修改,则L仍保留相同的id。换句话说,即使对象的大小和内容已更改,L仍与同一对象关联。
对于不可变的对象,我的理解是不允许修改对象。因此,如果使用新值重新分配了变量,则该变量将绑定到具有不同ID的新对象。我希望字符串的行为类似。但是我尝试修改一个字符串,但是字符串id并没有改变。
string = "blue"
for i in range(10):
string = string + str(i)
print("string id after {}th iteration: {}".format(i,id(string)))
string id after 0th iteration: 46958272
string id after 1th iteration: 46958272
string id after 2th iteration: 46958272
string id after 3th iteration: 47077400
string id after 4th iteration: 47077400
string id after 5th iteration: 47077400
string id after 6th iteration: 47077400
string id after 7th iteration: 47077400
string id after 8th iteration: 47077400
string id after 9th …Run Code Online (Sandbox Code Playgroud) 我有以下一段代码
import java.io.*;
import java.util.*;
class MainDriver{
public static void main(String aa[]){
Scanner reader = new Scanner (System.in);
String name;
System.out.println("enter your name");
name = reader.nextLine();
name.trim();
System.out.println (name);
}
}
Run Code Online (Sandbox Code Playgroud)
如果我在输入中给出空格,我想知道输出
输入
bayant singh
Run Code Online (Sandbox Code Playgroud)
产量
bayant singh
Run Code Online (Sandbox Code Playgroud)
那么为什么name.trim;不在这里工作?因为我猜输出是
bayantsingh //no spaces
Run Code Online (Sandbox Code Playgroud) 可能重复:
String的优点是什么?
字符串是不可改变的?
String s = "PROJECT";
Run Code Online (Sandbox Code Playgroud)
这里s不能修改.但是String s2=s.toLowerCase()会给我一个新的字符串.在这里,我仍然可以获得原始字符串的新副本!但是如果Java仍然需要不变性,那么为什么不在修改字符串时限制用户(抛出异常或其他东西).那为什么不变吗?任何人都可以解释原因吗?
java ×4
immutability ×2
mutable ×2
string ×2
calendar ×1
code-first ×1
constructor ×1
guice ×1
ios ×1
julia ×1
poco ×1
python ×1
swift ×1