对象javadocs和Josh Bloch告诉我们如何实现hashCode/equals,好的IDE将正确处理各种类型的字段.所有的,有些讨论是在这里.
这个问题是关于下一步:你如何确保它们保持良好状态?
特别是,我觉得对于大多数类来说,equals/hashCode应该像Bloch建议的那样实现(以及Eclipse和其他IDE的实现),并考虑到该类中所有非派生的业务逻辑字段.在将新字段添加到类中作为继续工作的一部分时,人们常常忘记将它们添加到equals/hashCode实现中.当两个对象看起来相等时,这可能导致难以发现的错误,但实际上不同于最近引入的字段的值.
一个团队(甚至一个团队!)如何帮助确保类的equals/hashCode继续考虑所有相关字段,因为成员字段会发生变化?
我知道Apache的EqualsBuilder和HashCodeBuilder可以使用反射,这显然会考虑正确的字段,但我想避免使用它们的性能成本.是否有其他方法来标记未包含在equals/hashCode中的字段,应该是什么?静态代码分析,IDE功能,单元测试技术?
我在使用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) 例如,中国货币有ISO 4217代码CNY.由于该货币的自由全球交易受到限制,因此有第二种"离岸"货币等价物,称为CNH.维基百科对这一切有一点总结.
在Java 7,有一种方法可以更新ISO 4217 JVM附带的三个字母代码集.但是,它不能用于向现有国家/地区代码添加单独的货币代码:它将替换CNY为CNH,这对我的目的没有好处.
如何在不覆盖的情况下将CNH(不在ISO 4217列表中)添加到可用货币集中? Java 7CNY
换句话说,如何为一个国家/地区获取多种货币代码?
请注意,这个问题:如何将新货币代码添加到Java?被提出和回答了Java 6中.但是替换策略java.util.CurrencyData不起作用,因为该文件不再存在.
我最近回答了一个问题,为什么PolymorphismType.EXPLICIT不会将查询限制为特定请求的类.我对答案的研究让我怀疑为什么会有这样的注释,以及它有什么好处.
在Hibernate文档说以下内容:
显式多态性意味着只有显式命名该类的查询才会返回类实例.命名该类的查询将仅返回映射的子类的实例.
...然而,正如Stack Overflow 多次提出的那样,措辞有点令人困惑.人们希望使用它来避免子类表之间的连接,并且它不会按照预期的方式完成工作.特别是,如果你有一个A-> B类层次结构和A标EXPLICIT,查询上的一个将检索乙实例,以及因为他们是"......映射的子类".
我认为,这个注释的使用方式是B标记EXPLICIT.随后的查询上的一个将返回唯一的实例A的,不只是实际是A型的对象,而且对于填充仅共享领域B型的对象.这让注解用于轻量级模式.
所以我的问题是: 除了启用轻量级模式之外,这个注释还有其他好的用例吗?作为第二个问题,是否有关于它如何与各种InheritanceType值交互的文档,特别是每个类加入的子类和表?
使用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) 我经常使用内存中的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 …
我已经构建了一个基于RCP的应用程序,我的一个用户在Windows XP上运行,Sun JVM 1.6.0_12有一个完整的应用程序崩溃.应用程序运行两天后(这不是新版本或任何东西),他得到了漂亮的灰色JVM强制退出框,退出代码= 1073807364.
他当时远离机器,在应用程序日志中我唯一能找到的就是与数据库进行通信(SQL Server通过Hibernate).据我所知,没有hs_文件或类似的东西.网络搜索在各种应用程序中发现了一堆带有退出代码的崩溃报告,但我没有看到导致它的原因的任何基本解释.
谁能告诉我是什么原因导致的?是否有可能被抛弃的其他信息可能有用?
中国货币有ISO 4217代码CNY.由于该货币的自由全球交易受到限制,因此存在第二个"离岸"货币等价物,称为CNH.维基百科对这一切有一点总结.
CNH不在ISO 4217中,但我希望能够在我的应用程序中使用它,而无需编写我自己的Currency类.据推测,JVM安装中有某种列表.如何添加其他货币代码?
编辑:请参阅此问题以在Java 7中处理此问题
我有一个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时我的错误在哪里?