我不是100%确信这是一个好主意,但我今天碰到了一些目前实现的代码:
class MyWidget <T extends Enum<T> > {
MyWidget(Map<T, Integer> valueMap) {
mValueMap = valueMap;
}
Map<T, Integer> mValueMap;
}
Run Code Online (Sandbox Code Playgroud)
其中,MyWidget然后提供使用方法mValueMap转换传入的Enum从一个到/ Integer.
我正在考虑做的是试图重构这个,以便我宣布我的枚举:
interface MyInterface {
public Integer getValue();
}
enum MyEnum implements MyInterface {
foo, bar;
public Integer getValue() {
return ordinal();
}
}
Run Code Online (Sandbox Code Playgroud)
然后我就可以重MyWidget写成看起来像这样模糊的东西:
public class MyWidget<T extends Enum<T> extends MyInterface> {
...
}
Run Code Online (Sandbox Code Playgroud)
然后就可以getValue()从内部的MyInterfaceon T-type对象调用该方法MyWidget.当然,问题是" <T extends Enum<T> extends MyInterface>"不是有效的语法.有什么办法可以解决这个问题吗? …
有没有办法解决因两个相互引用的枚举导致的类加载问题?
我有两组枚举,Foo和Bar,定义如下:
public class EnumTest {
public enum Foo {
A(Bar.Alpha),
B(Bar.Delta),
C(Bar.Alpha);
private Foo(Bar b) {
this.b = b;
}
public final Bar b;
}
public enum Bar {
Alpha(Foo.A),
Beta(Foo.C),
Delta(Foo.C);
private Bar(Foo f) {
this.f = f;
}
public final Foo f;
}
public static void main (String[] args) {
for (Foo f: Foo.values()) {
System.out.println(f + " bar " + f.b);
}
for (Bar b: Bar.values()) {
System.out.println(b + " foo " + b.f);
}
} …Run Code Online (Sandbox Code Playgroud) 我是C#的新手,如果这是一个明显的问题,请道歉.
在MSDN Dispose示例中,它们定义的Dispose方法是非虚拟的.这是为什么?这对我来说似乎很奇怪 - 我希望IDisposable的子类具有自己的非托管资源,它只会覆盖Dispose并在自己的方法底部调用base.Dispose().
谢谢!
简短形式:CMS垃圾收集器似乎未能收集到越来越多的垃圾; 最终,我们的JVM填满了,应用程序变得没有响应.通过外部工具(JConsole或jmap -histo:live)强制GC 清除它一次.
更新:问题似乎与JConsole的JTop插件有关; 如果我们不运行JConsole,或者在没有JTop插件的情况下运行它,行为就会消失.
(技术说明:我们在Linux 2.6.9盒子上运行Sun JDK 1.6.0_07,32位.升级JDK版本并不是一个选择,除非有一个不可避免的主要原因.另外,我们的系统不是连接到可访问Internet的计算机,因此JConsole等的屏幕截图不是一个选项.)
我们当前正在运行带有以下标志的JVM:
-server -Xms3072m -Xmx3072m -XX:NewSize=512m -XX:MaxNewSize=512m
-XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+CMSParallelRemarkEnabled
-XX:CMSInitiatingOccupancyFraction=70
-verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimeStamps
-XX:+DisableExplicitGC
Run Code Online (Sandbox Code Playgroud)
在JConsole中观察内存图,有一个完整的GC,在我们的应用程序生命周期的前几个小时内每隔约15分钟运行一次; 在每个完整的GC之后,仍然有越来越多的内存在使用中.几个小时后,系统达到稳定状态,CMS旧版中大约有2GB的已用内存.
这听起来像是经典的内存泄漏,除非我们使用强制完整GC的任何工具(点击JConsole中的"收集垃圾"按钮,或运行jmap -histo:live等),旧版本突然降至~500MB使用,我们的应用程序在接下来的几个小时内再次响应(在此期间相同的模式继续 - 在每个完整的GC之后,越来越多的旧版本已经满了.)
需要注意的一点是:在JConsole中,报告的ConcurrentMarkSweep GC计数将保持为0,直到我们使用jconsole/jmap/etc强制GC.
使用jmap -histo并按jmap -histo:live顺序,我能够确定明显未收集的对象包括:
HashMaps和阵列HashMap$Entry(以1:1的比例)Vectors和Object数组(1:1的比例,与HashMaps的数量大致相同)HashSet,Hashtable和com.sun.jmx.remote.util.OrderClassLoaders,以及数组Hashtable$Entry(大约相同数量;大约是HashMaps和Vectors的一半)下面的GC输出中有一些摘录; 我对它们的解释似乎是CMS GC中止而没有故障转移到世界各地的GC.我是否以某种方式误解了这个输出?有什么东西会导致这种情况吗?
在正常运行时期间,CMS GC输出块看起来像这样:
36301.827: [GC [1 CMS-initial-mark: 1856321K(2621330K)] 1879456K(3093312K), 1.7634200 secs] [Times: user=0.17 sys=0.00, real=0.18 secs]
36303.638: [CMS-concurrent-mark-start] …Run Code Online (Sandbox Code Playgroud) 所以,我有以下代码:
public class Tester {
public static void doAssert(Object foo, Object bar) {
}
public static void doAssert(Object[] foo, Object[] bar) {
}
public static <T> T getValue(String name, Function<String, T> covert) {
return null;
}
public static void main (String[] args) {
doAssert(getValue("", Double::valueOf), null);
}
}
Run Code Online (Sandbox Code Playgroud)
如果我用javac v1.8.0_05编译它,这很好.在1.8.0_65下,我收到以下错误(如报告所示-Xdiags:verbose):
Tester.java:32: error: method doAssert in class Tester cannot be applied to given types;
doAssert(null, getValue("", Double::valueOf));
^
required: Object[],Object[]
found: <null>,Double
reason: argument mismatch; inferred type does not …Run Code Online (Sandbox Code Playgroud) 所以,我意识到答案可能是"很难",但是:
我有一个奇怪的想法,并想知道在Java中是否可以创建一个方法,如:
<T> T wrapInterface (Class<T> interfaceClass, T wrappedObject) {
if (mClass.isInterface()) {
//create a new implementation of interfaceClass that, in each method,
//does some action before delegating to wrappedObject
return thatImplementation;
}
}
Run Code Online (Sandbox Code Playgroud)
所以基本上,如果我的接口Foo定义了一个方法foo(),我希望这个方法创建一个看起来像这样的新类,用wrappedObject作为构造函数参数创建该类的实例,然后返回它:
public class GeneratedClass implements Foo {
private Foo wrapped;
public GeneratedClass (Foo wrapped) {
this.wrapped = wrapped;
}
@Override
public void foo () {
System.out.println("Calling Foo.foo() on wrapped object " +
wrapped.toString());
wrapped.foo();
}
}
Run Code Online (Sandbox Code Playgroud)
我正在考虑的应用程序比仅记录调用更复杂,但是记录就足够了.我想用大量的接口类型来做这个,这就是我不想手工编写所有GeneratedClasses的原因.
对于不需要语言外特征的解决方案的奖励积分(引入AspectJ或类似的东西),如果仅使用标准JDK库就可以实现双重奖励积分.
(我不需要一个精确的,可编译的答案;只需指向正确的工具/库/等设置就可以让我这样做.)
谢谢!
所以,我觉得在C++中应该有一个很好的内置解决方案,但我不确定它是什么.
我需要一个队列(理想情况下是线程安全的,但我可以自己将其包装在同步中,如果需要的话),它可以有效地处理字节组 - 允许不同大小的读/写.
所以,界面看起来像是
//removes the first bytesToRead elements from the front of the queue and places them in array; returns the actual number of bytes dequeued
int dequeue(unsigned char *array, int bytesToRead)
//Adds bytesToWrite elements from array to the end of the queue; does nothing and returns 0 if this would exceed the queue's max size
int enqueue(unsigned char *array, int bytesToWrite)
Run Code Online (Sandbox Code Playgroud)
我可以自己写一个没有太多困难,但似乎这应该是现成的容易完成的东西.
STL中最好的东西看起来可能是一个stringbuf - 我必须手动调用sgetc/pubseekoff,但看起来它会起作用.
我希望这样做是当前队列实现的替代品,这是一个性能问题; 在此实现中读取的是队列中数据量的O(N).(这是一个非常天真的实现 - 每个dequeue都会导致队列中剩余数据的数组副本.)
附加要求(如果需要,我可以在包装器中实现这些要求): - 我需要能够指定缓冲区的最大大小 - 如果可用的数据少于请求的数据,则读取操作应该检索所有可用数据 - 写操作应该执行如果请求的写入超过最大大小并返回失败指示,则不执行任何操作
所以,我的问题:1)stringbuf是否足够?假设不需要调整大小,读/写操作O(1)是否相对于缓冲区中的数据量?(显然,他们可能是所请求项目数量的O(n).) …
所以,我有一个带有一些遗留JDBC调用的应用程序,我需要使用一些额外的JPA操作进行更新.我需要能够将JDBC调用和JPA调用作为同一数据库事务的一部分.如果重要的话,我正在使用OpenJPA 2.1.1和Postgres 9.1.以下代码似乎正常工作 - 我运行了一些基本测试,并且JDBC和JPA语句都执行; 任何一个中的错误都会导致这对语句没有发生(例如,它们是同一个DB事务的一部分).我有没有看到任何问题 - 我违反了一些最佳做法,或者其他原因我不能以这种方式重新使用Connection对象?
EntityManager em = _em; //acquired from OpenJPA
em.getTransaction().begin();
Connection conn;
try {
OpenJPAEntityManager oem = (OpenJPAEntityManager) em.getDelegate();
conn = oem.getConnection();
PreparedStatement ps = conn.prepareStatement(myStatement);
//initialize parameters in ps
ps.executeUpdate();
em.merge(myJpaObject);
em.getTransaction().commit();
} finally {
if (ps != null && !ps.isClosed()) {
ps.close();
}
if (em.getTransaction().isActive()) {
em.getTransaction().rollback();
}
}
Run Code Online (Sandbox Code Playgroud)
谢谢!
今天一位同事遇到了一个有趣的问题,虽然我认为实际的,大局的答案是"我们遇到这个问题意味着我们做错了什么",我想我还是会问这个问题.
鉴于以下内容:
public class CrazyEnumTest {
public class EnumeratedThing<T extends Enum<T>> {
public T myValue;
public EnumeratedThing(T value) {
myValue = value;
}
}
public static void main (String[] args) {
String className = args[0];
String enumValue = args[1];
Enum<?> value1 = Enum.valueOf(Class.forName(className), enumValue);
EnumeratedThing<?> thing1 = new EnumeratedThing(value1);
}
}
Run Code Online (Sandbox Code Playgroud)
我在调用Enum.valueOf时遇到以下编译错误:
Bound mismatch: The generic method valueOf(Class<T>, String) of type Enum<E> is not applicable for the arguments (Class<capture#1-of ?>, String). The inferred type capture#1-of ? is not a valid …