小编sha*_*kan的帖子

有什么方法可以使hashCode/equals与类的业务定义保持一致?

对象javadocs和Josh Bloch告诉我们如何实现hashCode/equals,好的IDE将正确处理各种类型的字段.所有的,有些讨论是在这里.

这个问题是关于下一步:你如何确保它们保持良好状态?

特别是,我觉得对于大多数类来说,equals/hashCode应该像Bloch建议的那样实现(以及Eclipse和其他IDE的实现),并考虑到该类中所有非派生的业务逻辑字段.在将新字段添加到类中作为继续工作的一部分时,人们常常忘记将它们添加到equals/hashCode实现中.当两个对象看起来相等时,这可能导致难以发现的错误,但实际上不同于最近引入的字段的值.

一个团队(甚至一个团队!)如何帮助确保类的equals/hashCode继续考虑所有相关字段,因为成员字段会发生变化?

我知道Apache的EqualsBuilder和HashCodeBuilder可以使用反射,这显然会考虑正确的字段,但我想避免使用它们的性能成本.是否有其他方法来标记未包含在equals/hashCode中的字段,应该是什么?静态代码分析,IDE功能,单元测试技术?

java hashcode

20
推荐指数
2
解决办法
1255
查看次数

是什么导致Java 7中的G1垃圾收集器中止其并发标记阶段?

我在使用G1垃圾收集器的应用程序中偶尔注意到完整的GC,并试图找出它们发生的原因.

从一个区域扫描开始到下一个区域的循环摘录如下.在61807.406,记录完整的GC,然后记录并发标记中止的条目.我想知道的是为什么GC认为需要做一个完整的,停止世界的垃圾收集以及如何避免它.

请注意,此问题似乎之前已在OpenJDK邮件列表中被询问,但没有回复.

为简洁起见,我已经修剪了年轻的GC的细节,但如果需要,我可以在某处发布完整的块.

61805.878: [GC concurrent-root-region-scan-start]
61805.882: [GC concurrent-root-region-scan-end, 0.0033586]
61805.882: [GC concurrent-mark-start]
61806.133: [GC pause (young), 0.02836202 secs]
   [Eden: 498M(498M)->0B(478M) Survivors: 14M->34M Heap: 3025M(4096M)->2548M(4096M)]
 [Times: user=0.19 sys=0.00, real=0.03 secs] 
61806.426: [GC pause (young), 0.02766222 secs]
   [Eden: 478M(478M)->0B(480M) Survivors: 34M->32M Heap: 3050M(4096M)->2576M(4096M)]
 [Times: user=0.19 sys=0.00, real=0.03 secs] 
61806.717: [GC pause (young), 0.02214895 secs]
   [Eden: 480M(480M)->0B(502M) Survivors: 32M->10M Heap: 3056M(4096M)->2571M(4096M)]
 [Times: user=0.09 sys=0.00, real=0.02 secs] 
61807.000: [GC pause (young), 0.01899188 secs]
   [Eden: 502M(502M)->0B(502M) Survivors: 10M->10M Heap: 3074M(4096M)->2573M(4096M)]
 [Times: …
Run Code Online (Sandbox Code Playgroud)

java garbage-collection g1gc

13
推荐指数
1
解决办法
3184
查看次数

如何在Java 7中为现有国家/地区代码的java.util.Currency添加新货币?

例如,中国货币有ISO 4217代码CNY.由于该货币的自由全球交易受到限制,因此有第二种"离岸"货币等价物,称为CNH.维基百科对这一切有一点总结.

Java 7,有一种方法可以更新ISO 4217 JVM附带的三个字母代码集.但是,它不能用于向现有国家/地区代码添加单独的货币代码:它将替换CNYCNH,这对我的目的没有好处.

如何在不覆盖的情况下将CNH(不在ISO 4217列表中)添加到可用货币集中? Java 7CNY

换句话说,如何为一个国家/地区获取多种货币代码?

请注意,这个问题:如何将新货币代码添加到Java?提出和回答Java 6中.但是替换策略java.util.CurrencyData不起作用,因为该文件不再存在.

java jvm currency java-7

9
推荐指数
1
解决办法
4439
查看次数

PolymorphismType.EXPLICIT还有其他用例比"轻量级"模式?

我最近回答了一个问题,为什么PolymorphismType.EXPLICIT不会将查询限制为特定请求的类.我对答案的研究让我怀疑为什么会有这样的注释,以及它有什么好处.

Hibernate文档说以下内容:

显式多态性意味着只有显式命名该类的查询才会返回类实例.命名该类的查询将仅返回映射的子类的实例.

...然而,正如Stack Overflow 多次提出的那样,措辞有点令人困惑.人们希望使用它来避免子类表之间的连接,并且它不会按照预期的方式完成工作.特别是,如果你有一个A-> B类层次结构和A标EXPLICIT,查询上的一个将检索乙实例,以及因为他们是"......映射的子类".

我认为,这个注释的使用方式是B标记EXPLICIT.随后的查询上的一个将返回唯一的实例A的,不只是实际是A型的对象,而且对于填充仅共享领域B型的对象.这让注解用于轻量级模式.

所以我的问题是: 除了启用轻量级模式之外,这个注释还有其他好的用例吗?作为第二个问题,是否有关于它如何与各种InheritanceType值交互的文档,特别是每个类加入的子类和表?

java hibernate

9
推荐指数
0
解决办法
441
查看次数

我如何解决这个明显的EhCache死锁?

使用ehCache 2.4.4,我似乎陷入了ehCache Segment对象的死锁.从其他日志记录中,我知道'等待线程',1694最后在生成此堆栈跟踪之前9小时运行.与此同时,1696年已经完成了很多其他的工作,所以这个锁肯定会被错误地控制住.

我非常有信心我没有直接锁定任何Segment实例,所以我认为这是库内部的某种问题.有任何想法吗?

"Model Executor - 1696" Id=1696 in TIMED_WAITING on lock=java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject@92eb1ed
at sun.misc.Unsafe.park(Native Method)
at java.util.concurrent.locks.LockSupport.parkNanos(Unknown Source)
at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(Unknown Source)
at java.util.concurrent.PriorityBlockingQueue.poll(Unknown Source)
at com.rtrms.application.modeling.local.BlockingTaskList.takeTask(BlockingTaskList.java:20)
at com.rtrms.application.modeling.local.ModelExecutor.executeNextTask(ModelExecutor.java:71)
at com.rtrms.application.modeling.local.ModelExecutor.run(ModelExecutor.java:46)

Locked synchronizers: count = 1
  - java.util.concurrent.locks.ReentrantReadWriteLock$NonfairSync@4a3d767f

"Model Executor - 1694" Id=1694 in WAITING on    lock=java.util.concurrent.locks.ReentrantReadWriteLock$NonfairSync@4a3d767f
 owned by Model Executor - 1696 Id=1696
at sun.misc.Unsafe.park(Native Method)
at java.util.concurrent.locks.LockSupport.park(Unknown Source)
at java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(Unknown Source)
at java.util.concurrent.locks.AbstractQueuedSynchronizer.doAcquireShared(Unknown Source)
at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireShared(Unknown Source)
at java.util.concurrent.locks.ReentrantReadWriteLock$ReadLock.lock(Unknown Source)
at net.sf.ehcache.store.compound.Segment.unretrievedGet(Segment.java:248)
at net.sf.ehcache.store.compound.CompoundStore.unretrievedGet(CompoundStore.java:191)
at net.sf.ehcache.store.compound.impl.DiskPersistentStore.containsKeyInMemory(DiskPersistentStore.java:72)
at net.sf.ehcache.Cache.searchInStoreWithStats(Cache.java:1884) …
Run Code Online (Sandbox Code Playgroud)

java deadlock ehcache

6
推荐指数
1
解决办法
2197
查看次数

基于Hibernate的代码在hsqldb 1.8.1.3之上的单元测试不再适用于hsqldb 2.2.9

我经常使用内存中的HSQL数据库作为测试数据库来编写与数据库相关的代码的单元测试.最近我决定从1.8.1.3升级到2.2.9,以利用2.x版本分支中添加的ROW_NUMBER()支持.

似乎在某种程度上,新版本比旧版本更严格.使用Hibernate(3.6.10)作为ORM,我可能会创建一个Configuration对象来创建第一个SessionFactory,使用它来填充测试数据,然后使用Configuration到被测试的类,这将创建它自己SessionFactory进行选择.使用hsqldb 1.8.1.3,没问题.使用2.2.9,hsqldb代码中的select块.以下是SSCCE证明:

public void testTwoSessionFactories() throws Exception {
    boolean withTx = false;

    AnnotationConfiguration config = new AnnotationConfiguration().addAnnotatedClass(Entity.class);
    config.setProperty("hibernate.hbm2ddl.auto", "create");
    config.setProperty(Environment.DIALECT, HSQLDialect.class.getName());
    config.setProperty(Environment.DRIVER, jdbcDriver.class.getName());
    config.setProperty(Environment.URL, "jdbc:hsqldb:mem:testDB");
    config.setProperty(Environment.USER, "SA");
    config.setProperty(Environment.PASS, "");

    SessionFactory sessionFactory1 = config.buildSessionFactory();
    Session session = sessionFactory1.openSession();

    Transaction tx = null;
    if (withTx)
        tx = session.beginTransaction();

    session.save(new Entity("one"));

    if (withTx)
        tx.commit();

    session.flush();
    session.close();

    config.setProperty("hibernate.hbm2ddl.auto", "");
    SessionFactory sessionFactory2 = config.buildSessionFactory();
    Session session2 = sessionFactory2.openSession();
    List entities = session2.createCriteria(Entity.class).list();
    session2.close();
}
Run Code Online (Sandbox Code Playgroud)

注意withTx …

java hibernate jdbc hsqldb

6
推荐指数
1
解决办法
2439
查看次数

JVM退出代码1073807364的原因是什么?

我已经构建了一个基于RCP的应用程序,我的一个用户在Windows XP上运行,Sun JVM 1.6.0_12有一个完整的应用程序崩溃.应用程序运行两天后(这不是新版本或任何东西),他得到了漂亮的灰色JVM强制退出框,退出代码= 1073807364.

他当时远离机器,在应用程序日志中我唯一能找到的就是与数据库进行通信(SQL Server通过Hibernate).据我所知,没有hs_文件或类似的东西.网络搜索在各种应用程序中发现了一堆带有退出代码的崩溃报告,但我没有看到导致它的原因的任何基本解释.

谁能告诉我是什么原因导致的?是否有可能被抛弃的其他信息可能有用?

java jvm windows-xp sun exit-code

5
推荐指数
1
解决办法
9039
查看次数

如何将新货币代码添加到Java?

中国货币有ISO 4217代码CNY.由于该货币的自由全球交易受到限制,因此存在第二个"离岸"货币等价物,称为CNH.维基百科对这一切有一点总结.

CNH不在ISO 4217中,但我希望能够在我的应用程序中使用它,而无需编写我自己的Currency类.据推测,JVM安装中有某种列表.如何添加其他货币代码?

编辑:请参阅此问题以在Java 7中处理此问题

java locale jvm currency

5
推荐指数
1
解决办法
2999
查看次数

java.lang.IndexOutOfBoundsException

我有一个SQL查询返回整数数组.

ArrayList<Integer> intArray = new ArrayList<>(44);

while (result.next()){
   intArray.add(result.getInt("CNT"));     // Insert the result into Java Array List
}

// Insert the result into Java Object
dc = new DCDataObj(
       intArray.get(1), //    Datacenter          1000
       intArray.get(2), //    Zone                1100
       ..................
     )
Run Code Online (Sandbox Code Playgroud)

运行代码时出现此错误: java.lang.IndexOutOfBoundsException: Index: 40, Size: 40

你能告诉我使用ArrayList时我的错误在哪里?

java arraylist

0
推荐指数
1
解决办法
1039
查看次数