有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

C++中的java=rh?

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

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

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++)

多谢各位


共 (6) 个答案

  1. # 1 楼答案

    我不知道有什么通用的方法可以将字段的所有内容从一个对象复制到另一个对象,而不使用

    • 反思
    • 生成的代码
    • 使用不安全类进行复制

    反射在运行时更容易使用,但效率不如生成的代码。(但非常接近)我生成了我的数据模型,所以我使用了这个选项

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

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

  2. # 2 楼答案

    public class SomeObject
    {
        private static Hashtable _objects;
    
        public static SomeObject getInstance(SomeKey some_key)
        {
            return _objects.get(some_key);
        }
    }
    
  3. # 3 楼答案

    最接近的是^{},但请先阅读Effective Java中的相关部分

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

  4. # 4 楼答案

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

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

  5. # 5 楼答案

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

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

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

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

  6. # 6 楼答案

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