Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/380.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
`*Java中的this=rhs`? 我来自C++世界,我找不到java替代品(如果有的话): struct SomeStruct { SomeStruct(){} SomeStruct(const SomeStruct& rhs) { *this = rhs; } };_Java_C++ - Fatal编程技术网

`*Java中的this=rhs`? 我来自C++世界,我找不到java替代品(如果有的话): struct SomeStruct { SomeStruct(){} SomeStruct(const SomeStruct& rhs) { *this = rhs; } };

`*Java中的this=rhs`? 我来自C++世界,我找不到java替代品(如果有的话): struct SomeStruct { SomeStruct(){} SomeStruct(const SomeStruct& rhs) { *this = rhs; } };,java,c++,Java,C++,我之所以需要它,是因为我有一个现有对象的缓存,所以我不想创建另一个实例,只想“克隆”现有的实例,类似这样: public class SomeObject { private static Hashtable _objects; SomeObject() { SomeObject obj = _objects.get(some_key); if (obj != null) { // *this = obj;

我之所以需要它,是因为我有一个现有对象的缓存,所以我不想创建另一个实例,只想“克隆”现有的实例,类似这样:

public class SomeObject
{
    private static Hashtable _objects;
    SomeObject()
    {
        SomeObject obj = _objects.get(some_key);
        if (obj != null) {
            // *this = obj;
            // instead of: 
            // this.something = obj.something;
            // this.something1 = obj.something1;
            // this.something2 = obj.something2;
            // a zillion fields....
        }
    }
};
编辑:

抱歉,我混淆了一些东西(仍然需要学习Java和C++)

谢谢

最接近的是,但请先阅读相关章节


如果您删除了一些需求,可能有更简单的方法来完成您想要的任务。例如,如果使对象不可变,则不需要将数据复制到另一个对象中。相反,您可以返回对原始对象的引用。这比memberwise复制快得多,而且还有许多其他好处,例如更容易编写线程安全的代码。

在Java中,如果您想要有一个与复制构造函数相对应的构造函数,您必须自己实现它。在某些情况下,这意味着您必须将字段从一个对象实例复制到另一个对象实例,而在其他情况下,这意味着您必须实现一个完整的深度复制—递归地遍历copy ctor中参数的引用字段


这取决于您想要什么-是否也要复制
对象
哈希表?还是两个对象都应该共享对它的引用?有关更多信息,请参阅。

您应该使用单例模式。创建SomeObject的静态实例并使用该实例

   private static class SingletonHolder { 
     public static final SomeObject INSTANCE = new SomeObject();
   }

   public static SomeObject getInstance() {
     return SingletonHolder.INSTANCE;
   }

但是不要陷入单例陷阱,限制对getInstance()的调用

没有直接的等价物
Object.clone()
是最接近的,但它会创建一个新实例并执行浅拷贝。不过,您可以使用反射编写一些通用的内容。

我不知道有任何通用的方法可以不使用反射将字段的所有内容从一个对象复制到另一个对象

public class SomeObject
{
    private static Hashtable _objects;

    public static SomeObject getInstance(SomeKey some_key)
    {
        return _objects.get(some_key);
    }
}
  • 反思
  • 生成的代码
  • 使用不安全类进行复制
反射在运行时更容易使用,但效率不如生成的代码。(但非常接近)我生成了我的数据模型,所以我使用了这个选项

不安全类比反射快,但不跨平台和不安全。它几乎与生成的代码一样快。;)


就速度而言,如果生成的代码为1x,则对于高速缓存的数据,不安全的代码为1.5-2x,反射速度为2-4x。对于缓存不好的数据,您看不出有什么区别。

您的问题不清楚您是在尝试实现不可变对象的纯缓存,还是保留“模板”对象的缓存,然后返回可由客户端修改的副本。我将假设后者

假设您确实希望返回原件的副本。在Java中没有真正好的方法来实现复制构造函数。Clone稍微好一点,因此您应该将构造函数隐藏在静态工厂方法后面:

public static SomeObject getInstance(...) {
  SomeObject cached = ...;
  if (cached != null) {
    return cached.clone();
  }
  ...
}

也许在您的特定情况下,您可以分离对象的不可变部分和有状态部分?如果是这样的话,对对象模型的某些更改可以产生更干净(更高效)的代码?

请记住,这样做会多次引用同一个对象,而执行object.clone()则会创建另一个对象。问题表明某个对象的实例不止一个,而且它们是不同的。因此,也许你的想法最好用一个单例工厂来表达?实际上,它需要一个更复杂的逻辑,比如单例工厂默认执行所有成员的浅拷贝,不创建新实例。java没有等效项。@Erik:编译器生成的赋值运算符执行成员级复制。@Thomas:是的,浅层复制。@Erik:否,它递归地将赋值运算符应用于所有成员。它应该执行深度复制,尽管一个差劲的程序员可能会编写它。@Erik:我不使用“浅复制”。Bitwise意味着memcpy-like,所以这也是不正确的。如果你所说的“浅”是指“复制每个成员”,那么就这么说吧。:)人们真的用C++实现复制构造函数吗?而不是被解雇?听起来你只是想要一个对缓存对象的引用。如果是这样的话,看看我的答案。我不明白,你有这些对象的“缓存”,你想“克隆”一个实例,而不“创建一个新实例”???很抱歉,“克隆”和“不创建新实例”是正交的。“克隆”意味着您已经创建了一个新实例并复制了属性。。。你为什么不直接使用缓存中的实例呢?@Thomas:是的,人们真的用这种方式实现复制构造函数。这是减少复制构造函数和
operator=
@dan04之间代码重复的一种方便方法-您应该注意在赋值运算符方面实现复制构造函数,因为一个好的赋值运算符在进行复制之前会释放现有资源。问题是,在构造函数中,您不必设置任何这些资源,因此很容易读取错误数据。通常最好用复制构造函数和析构函数实现赋值运算符,因为赋值运算符实际上是“拆下这个对象,然后重新构建它”。我猜这也是OP想要的,但可能需要了解Java如何处理对象传递。。。