小编Sbo*_*odd的帖子

如何将泛型参数作为实现接口的枚举?

我不是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>"不是有效的语法.有什么办法可以解决这个问题吗? …

java generics enums

46
推荐指数
1
解决办法
1万
查看次数

Java Enums:两个枚举类型,每个类型包含对彼此的引用?

有没有办法解决因两个相互引用的枚举导致的类加载问题?

我有两组枚举,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)

java oop enums classloader cyclic-reference

31
推荐指数
2
解决办法
2万
查看次数

为什么Dispose()是非虚拟的?

我是C#的新手,如果这是一个明显的问题,请道歉.

MSDN Dispose示例中,它们定义的Dispose方法是非虚拟的.这是为什么?这对我来说似乎很奇怪 - 我希望IDisposable的子类具有自己的非托管资源,它只会覆盖Dispose并在自己的方法底部调用base.Dispose().

谢谢!

.net c# dispose idisposable

31
推荐指数
3
解决办法
5088
查看次数

Java ConcurrentMarkSweep垃圾收集器不会删除所有垃圾

简短形式: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,Hashtablecom.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)

java garbage-collection concurrent-mark-sweep

10
推荐指数
2
解决办法
9628
查看次数

Java 1.8.0_65的推断类型问题

所以,我有以下代码:

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 generics type-inference java-8

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

Java:在运行时创建类型的新实现?

所以,我意识到答案可能是"很难",但是:

我有一个奇怪的想法,并想知道在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库就可以实现双重奖励积分.

(我不需要一个精确的,可编译的答案;只需指向正确的工具/库/等设置就可以让我这样做.)

谢谢!

java code-generation interface word-wrap

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

C++:具有多个元素的高效获取/放置的队列?

所以,我觉得在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).) …

c++ queue stl

5
推荐指数
2
解决办法
4493
查看次数

在一个事务中组合JPA和JDBC操作

所以,我有一个带有一些遗留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)

谢谢!

java postgresql jpa jdbc openjpa

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

Java Enums:从文件中反序列化任意枚举

今天一位同事遇到了一个有趣的问题,虽然我认为实际的,大局的答案是"我们遇到这个问题意味着我们做错了什么",我想我还是会问这个问题.

鉴于以下内容:

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 …

java enums serialization

4
推荐指数
1
解决办法
3573
查看次数