我现在已经实现了一些Java应用程序,到目前为止只有桌面应用程序.我更喜欢使用不可变对象在应用程序中传递数据,而不是使用带有mutator(setter 和getter)的对象,也称为JavaBeans.
但是在Java世界中,使用JavaBeans似乎更常见,我无法理解为什么我应该使用它们.就个人而言,如果代码只处理不可变对象而不是一直改变状态,那么代码看起来会更好.
第15项中还建议使用不可变对象:最小化可变性,有效Java 2ed.
如果我有一个Person实现为JavaBean的对象,它看起来像:
public class Person {
private String name;
private Place birthPlace;
public Person() {}
public setName(String name) {
this.name = name;
}
public setBirthPlace(Place birthPlace) {
this.birthPlace = birthPlace;
}
public String getName() {
return name;
}
public Place getBirthPlace() {
return birthPlace;
}
}
Run Code Online (Sandbox Code Playgroud)
并且Person实现为不可变对象:
public class Person {
private final String name;
private final Place birthPlace;
public Person(String name, …Run Code Online (Sandbox Code Playgroud) 有没有更好的方法来做到这一点......
MyString.Trim().Replace("&", "and").Replace(",", "").Replace(" ", " ")
.Replace(" ", "-").Replace("'", "").Replace("/", "").ToLower();
Run Code Online (Sandbox Code Playgroud)
我已经扩展了字符串类以使其保持一个工作但是有更快的方法吗?
public static class StringExtension
{
public static string clean(this string s)
{
return s.Replace("&", "and").Replace(",", "").Replace(" ", " ")
.Replace(" ", "-").Replace("'", "").Replace(".", "")
.Replace("eacute;", "é").ToLower();
}
}
Run Code Online (Sandbox Code Playgroud)
只是为了好玩(以及停止评论中的论点),我已经推动了以下各种示例的基准测试.
正则表达式选项得分非常高; 字典选项最快; stringbuilder replace的long winded版本比short hand稍快.
在不改变原始对象的情况下从特定键的对象中删除值的好方法和简短方法是什么?
我想做点什么:
let o = {firstname: 'Jane', lastname: 'Doe'};
let o2 = doSomething(o, 'lastname');
console.log(o.lastname); // 'Doe'
console.log(o2.lastname); // undefined
Run Code Online (Sandbox Code Playgroud)
我知道有很多不可变的库用于这样的任务,但我想在没有库的情况下离开.但要做到这一点,一个要求是有一个简单而简短的方法可以在整个代码中使用,而不会将方法作为效用函数抽象出来.
例如,为了添加值,我执行以下操作:
let o2 = {...o1, age: 31};
这很简单,易于记忆,不需要实用功能.
是否有类似的东西去除值?ES6非常受欢迎.
非常感谢你!
从最近的SO问题(参见在python中创建一个由列表索引的字典)我意识到我可能对python中可散列和不可变对象的含义有一个错误的概念.
您好如何设置R G B值System.Drawing.Color.G?
这是System.Drawing.Color.G=255;不允许的,因为它是只读的
Property or indexer 'System.Drawing.Color.G' cannot be assigned toit is read only
Run Code Online (Sandbox Code Playgroud)
我只需要Color通过分配自定义R G B值来创建一个Object
今天,我试图将我的头围绕在彼此引用的不可变对象上.我得出的结论是,如果不使用惰性评估,你不可能做到这一点,但在这个过程中我写了这个(在我看来)有趣的代码.
public class A
{
public string Name { get; private set; }
public B B { get; private set; }
public A()
{
B = new B(this);
Name = "test";
}
}
public class B
{
public A A { get; private set; }
public B(A a)
{
//a.Name is null
A = a;
}
}
Run Code Online (Sandbox Code Playgroud)
我觉得有趣的是,我想不出另一种在尚未完全构造且包含线程的状态下观察A类对象的方法.为什么这甚至有效?有没有其他方法来观察未完全构造的物体的状态?
所以我在一周前开始学习React,我不可避免地遇到了状态问题以及组件应该如何与应用程序的其余部分进行通信.我四处搜索,Redux似乎是这个月的味道.我阅读了所有文档,我认为这实际上是一个非常具有革命性的想法.以下是我的想法:
国家通常被认为是非常邪恶的,并且是编程中的大量漏洞.而不是在整个应用程序中散布它全部Redux说为什么不把它全部集中在一个全局状态树中,你必须发出改变的动作?听起来不错.所有程序都需要状态,所以让我们把它放在一个不纯净的空间中,只在那里修改它,这样就很容易找到错误.然后我们也可以声明性地将各个状态片段绑定到React组件并让它们自动重绘,一切都很美.
但是,我对这整个设计有两个问题.首先,为什么状态树需要是不可变的?说我不关心时间旅行调试,热重新加载,并且已经在我的应用程序中实现了撤消/重做.必须这样做似乎很麻烦:
case COMPLETE_TODO:
return [
...state.slice(0, action.index),
Object.assign({}, state[action.index], {
completed: true
}),
...state.slice(action.index + 1)
];
Run Code Online (Sandbox Code Playgroud)
而不是这个:
case COMPLETE_TODO:
state[action.index].completed = true;
Run Code Online (Sandbox Code Playgroud)
更不用说我正在制作一个在线白板只是为了学习,每个状态的变化可能就像在命令列表中添加画笔笔划一样简单.经过一段时间(数百次刷子)复制整个阵列可能会开始变得非常昂贵和耗时.
我没有使用独立于通过操作进行变异的UI的全局状态树,但它确实需要是不可变的吗?像这样的简单实现有什么问题(非常粗略的草案.在1分钟内写完)?
var store = { items: [] };
export function getState() {
return store;
}
export function addTodo(text) {
store.items.push({ "text": text, "completed", false});
}
export function completeTodo(index) {
store.items[index].completed = true;
}
Run Code Online (Sandbox Code Playgroud)
它仍然是一个通过发出的动作而变异的全局状态树,但非常简单和有效.
该
Object.freeze()方法冻结了一个对象:即阻止向其添加新属性; 防止删除现有属性; 并防止现有属性或其可枚举性,可配置性或可写性被更改.实质上,该对象实际上是不可变的.该方法返回被冻结的对象.
我原以为在日期上调用冻结会阻止对该日期的更改,但它似乎不起作用.这是我正在做的(运行Node.js v5.3.0):
let d = new Date()
Object.freeze(d)
d.setTime(0)
console.log(d) // Wed Dec 31 1969 16:00:00 GMT-0800 (PST)
Run Code Online (Sandbox Code Playgroud)
我本以为setTime要么失败要么无所事事.任何想法如何冻结日期?
我无法得到我们需要一个不可变类的场景.
你有没有遇到过这样的要求?或者你可以给我们任何一个我们应该使用这种模式的真实例子.