当前位置: 首页 > 知识库问答 >
问题:

在运行时创建一个唯一类,用作HashMap中的键

华甫
2023-03-14

我知道这是一个可怕的黑客行为,但我需要编辑一个外部库以符合我们项目的需要。我正在更改的项目将类映射存储到所述类的实例。这个项目的初衷是不可能有重复的类,但我需要它们。我的解决方案是对每个相关对象应用一个UniqueClass字段,然后每个对象都有一个对我需要创建其实例的类的引用。这样,UniqueClass是什么其实根本不重要,只是它是唯一的。

现在,我需要一种方法在运行时创建一个唯一的类来存储在这个映射中。以下是我看到的选项:

>

生成唯一的匿名类。这是可行的,但只适用于第一个副本。任何额外的重复项都将被视为与原始匿名类(ClassBuilder$1)相同。我在这里读到过,可以使用ClassBuilder$2等,但我不知道如何做到这一点。

 Object object = new Object(){};
 return object.getClass();

使用代理类。我真的不明白这些,但是它的结果和上面的匿名类一样,因为javadocs声明如果一个代理类已经存在,它只是返回那个。

Class proxyClass = Proxy.getProxyClass(inter.class.getClassLoader(), new Class[] { inter.class });  
return proxyClass;

(确实是最糟糕的方法)创建一个类包,当每个类都用作唯一类时,这些类会被迭代。丑陋的代码,大量不必要的类,最终可能限制重复的数量。

这个问题有没有一个优雅的解决方案?

共有1个答案

孙福
2023-03-14

我正在修改源代码本身。

在这种情况下,创建一个包装器对象,用作映射中的键。您可以根据需要重写equals()hashCode(),以实现您的目标。本质上,您是在向现有的类和实例的多映射中添加一层间接寻址。

 类似资料:
  • 我有一个HashMap,一个键作为某个类的对象,一个值作为另一个HashMap,它的键是一个字符串,值是一个双倍: 我需要一个循环,将键(对象)和值(HashMaps)添加到这个HashMap,但我不能在循环中创建一个新的HashMap变量作为它的值。本质上,每个MyClass对象都必须具有具有相应Double的Strings。 这可能吗?这有什么意义吗??

  • 问题内容: 我正在使用MS SQL Server Management Studio。我有桌子- 我想从该表创建另一个包含2列的表,以便column_1在Num_ID中提供唯一值(即1,2,3,4等),而column_2在Alpha_ID中提供唯一值(A,B,C等) 。 但是,如果已经出现一个字母,则不应再次出现。所以输出将是这样的- 希望这是有道理的。我想澄清一下,输入表中的ID不是我所显示的数

  • 问题内容: 我需要在Java中创建一个时间戳(以毫秒为单位),以确保在特定的VM实例中是唯一的。即需要某种方式来限制System.currentTimeMillis()的吞吐量,以便它每毫秒最多返回一个结果。关于如何实施的任何想法? 问题答案: 这样可以使时间尽可能接近当前时间,而不重复。 避免每毫秒限制一个id的一种方法是使用微秒级的时间戳。例如,将currentTimeMS乘以1000。这将允

  • 我有一个带有springcassandra的SpringBoot2项目,我正在使用@RefreshScope在运行时创建密钥空间,并且我正在执行查询以使用该密钥空间,但模式不是从带有@Table注释的实体创建的。 当我启动应用程序时,如果不存在,就会创建一个新的键空间,并创建模式。之后,我更改app.properties中的keyspace,并向actuator/refresh发送POST请求。新

  • 问题内容: 我知道我可以使用它来创建DDL创建触发器; 问题在于,该触发器将在“创建序列”之类的DDL上运行;如何仅对“创建表” DDL执行此操作? 问题答案: CREATE OR REPLACE TRIGGER create_table_trigger AFTER CREATE ON SCHEMA BEGIN IF SYS.DICTIONARY_OBJ_TYPE = ‘TABLE’ THEN .

  • 问题内容: 不知道在PostgreSQL 9.3+中是否可行,但是我想在非唯一列上创建唯一索引。对于像这样的表: 我想仅能[快速]查询不同的日子。我知道我可以用来帮助执行不同的搜索,但是如果不同值的数量大大少于索引覆盖的行数,这似乎会增加额外的开销。就我而言,大约30天中有1天与众不同。 我是创建关系表以仅跟踪唯一条目的唯一选择吗?思维: 并在每次插入数据时使用触发器来更新它。 问题答案: 索引只