小编Raf*_*ter的帖子

Self-type - 需要类型绑定内的类型

我想知道是否有可能限制在接口上声明的方法要求类型绑定内的类型。实际上,我想提供一种在无法提供真正类型安全的情况下强制转换类型安全的方法。

例如,考虑具有Base通过中间接口继承的基本类型的层次结构。通常,人们知道一种类型是接口,FirstInterface但不知道是什么特定的类正在实现它。我想要一种方法,它允许转换到接口的任一实现,而不允许转换到其他实现,Base如下例所示:

interface Base<TYPE extends Base<TYPE>> {
  default <CAST extends TYPE> CAST as(Class<? extends CAST> type) {
    if (type.isInstance(this)) {
      return type.cast(this);
    } else {
      throw new IllegalArgumentException();
    }
  }
}

interface FirstIface<TYPE extends FirstIface<TYPE>> extends Base<TYPE> { }
class FirstClassA implements FirstIface<FirstClassA> { }
class FirstClassB implements FirstIface<FirstClassB> { }

interface SecondIface<TYPE extends SecondIface<TYPE>> extends Base<TYPE> { }
class SecondClassA implements SecondIface<SecondClassA> { }
class SecondClassB implements SecondIface<SecondClassB> { }

interface …
Run Code Online (Sandbox Code Playgroud)

java generics

15
推荐指数
1
解决办法
584
查看次数

如何使Jersey使用GZip压缩作为响应消息体

我正在尝试编写一个简单的Jersey应用程序,它将文件从Jersey客户端发送到Jersey服务器并返回.但是,文件似乎只是在从客户端到服务器的路上编码而不是其他方式.我想知道如何改变这种行为.

我在一个简单的例子中测试它:

public class GZipEncodingTest extends JerseyTest {

  private static final String PATH = "/";
  private static final String QUESTION = "foo", ANSWER = "bar";
  private static final String ENCODING_GZIP = "gzip";

  @Path(PATH)
  public static class MyResource {
    @POST
    public Response handle(String question) throws IOException {
      assertEquals(QUESTION, question);
      return Response.ok(ANSWER).build(); // (1)
    }
  }

  @Override
  protected Application configure() {
    enable(TestProperties.LOG_TRAFFIC);
    enable(TestProperties.DUMP_ENTITY);
    return new ResourceConfig(MyResource.class, GZipEncoder.class);
  }

  @Override
  @SuppressWarnings("unchecked")
  protected void configureClient(ClientConfig config) {
    config.register(new EncodingFeature(ENCODING_GZIP, GZipEncoder.class));
  }

  @Test
  public void …
Run Code Online (Sandbox Code Playgroud)

glassfish jax-rs jersey

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

具有setRetainInstance(true)的片段是否能够在进程关闭后继续存在?

考虑到这种情况:如果我创建了一个活动并且它移动到后台并且此活动包含Fragment设置为,setRetainInstance(true)则Android操作系统可能在某些时候仍然决定关闭活动的托管过程以释放内存.

然后,Activity状态被保存onSaveInstanceState(Bundle)在哪里 - 据我所知 - 将相关Bundle内容写入文件系统,以便在关闭过程中继续存在.(因此束中对象的要求是Serializable).稍后,可以通过新进程检索应用程序状态onRestoreInstanceState(Bundle).

相反,我Fragment被允许包含不一定的变量Serializable.因此,我想,Fragment不能像磁盘一样存储在磁盘Bundle上.那么当进程被杀死时,我的片段会发生什么?

我想知道这个阅读开发人员的指南(http://developer.android.com/guide/components/processes-and-threads.html):

保存当前对用户不可见的活动的进程(已调用活动的onStop()方法).这些过程对用户体验没有直接影响,系统可以随时终止它们以回收前台,可见或服务进程的内存.通常有许多后台进程在运行,因此它们保存在LRU(最近最少使用的)列表中,以确保具有用户最近看到的活动的进程是最后被杀死的进程.如果活动正确实现其生命周期方法并保存其当前状态,则终止其进程将不会对用户体验产生明显影响,因为当用户导航回活动时,活动将恢复其所有可见状态.

我理解上面的杀戮,以便关闭VM实例并将进程的状态写入文件系统(这里是进行Bundle中).稍后读取包以恢复该过程.由于片段的保留不涉及生命周期方法,因为我不知道如何保留例如指向网络连接的指针(你当然不应该在片段中有这样的指针),我想知道片段是否存在如果在此期间关闭该过程,仍然会恢复.我得出结论,他们肯定需要重新创建,因此生命周期方法应尽可能优先setRetainInstance(true)考虑.

这个假设是否有意义?

lifecycle android process fragment retain

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

如何在IntelliJ中设置具有相同层次结构模块的多模块项目?

我想知道如何在IntelliJ中配置以下项目布局:

  1. 一个Android应用程序
  2. 服务器后端向此应用程序提供数据
  3. 在后端和Android应用程序之间共享的Bean类

最初,我想在相同的层次结构级别上创建三个模块.但是,IntelliJ似乎无法做到这一点.我只能在第一个模块中添加新模块.我想知道这是不是我应该这样做的方式?或者有更好的方法使用IntelliJ配置此项目布局?这些层次结构只代表文件夹吗?

我觉得我应该制作(3)库模块并将依赖项添加到(1)和(2).由于模块被定义为一个独立的功能单元,您可以独立编译,运行,测试和调试,我觉得这是正确的方法.

这是我在IntelliJ中的第一个多模块项目.任何解释都表示赞赏!

module intellij-idea multi-module

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

LinkedIdentityHashSet

我知道IdentityHashSet(通过Collections#newSetFromMap(Map))和LinkedHashSet.但是,我需要的是两者的结合,a LinkedIdentityHashSet.我在网上找不到任何现成的解决方案.有谁知道如何调整这个?

谢谢你的建议!

java collections

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

JIT不编译大型方法的理由是什么?

我想知道为什么JVM的JIT编译器会忽略编译中的"巨大方法".(除非该DontCompileHugeMethods标志设置为false.)与此同时,大多数关于Java的JIT编译器的讨论表明内联是一种超级优化,因为它允许增加大量需要编译的指令.这个更大的编译上下文允许更好地优化执行的代码.有了这个,我认为一个巨大的方法与一个内联方法很大不一样,应该是JIT编译的一个很好的目标.我在这里错过了什么?

java jit

12
推荐指数
1
解决办法
1159
查看次数

Hibernate javassist proxies和`Object#equals`

#equals在Java中为UDT 提供实现时,其中一个条件是传递的参数对象必须是当前类的实例,否则我们会失败 - 快速return false查看Effective Java(EJ2).但是,在使用Hibernate 4时,由于延迟加载,这种#equals情况会失败,因此最终会导致javassist代理实例.什么是克服这个问题的最佳选择?我能想到的几个选择是:

  • 扩展equals实现以考虑代理案例.缺点:可维护性收费,对Hibernate代理基础架构的硬连线依赖,hacky,实体或域模型应该与所使用的ORM无关,即因为它们可能在不需要ORM的情况下重用,例如Swing UI.
  • 在调用之前检查它是否是代理equals.缺点:并非总是可能,即处理集合和隐式调用equals,例如Map.
  • 避免使用延迟加载.缺点:在所有用例中都不合理也没有效率.

UPDATE

再次回顾EJ2我相信以下内容适用于所有场景(Type-Type,Type-Proxy,Proxy-Type和Proxy-Proxy),但正如下面的一条评论中所指出的,如果将Type与之比较,它可能永远循环完全不同的类型,例如Person.equals(Employee),两者都使用相同的等于EJ2标准.

    if (this.getClass() != anObject.getClass())
    {
        return anObject.equals(this);
    }
Run Code Online (Sandbox Code Playgroud)

java orm hibernate javassist

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

如果方法是通过其显式类型调用的,那么运行时性能是否重要?

我目前正在编写一个创建Java字节代码并编写方法调用的应用程序.到目前为止,编写此字节代码的模块没有关于调用方法调用的实例的实际类型的信息,但它确实知道为其定义特定方法的类型.例如:

class Foo {   
  public void foo() { } 
}

class Bar extends Foo {   
  public void bar() { } 
}
Run Code Online (Sandbox Code Playgroud)

当前版本的引擎将执行

INVOKEVIRTUAL Foo.foo
Run Code Online (Sandbox Code Playgroud)

甚至在类型的对象上,Bar因为它知道在foo中定义了Foo.这在JVM中是合法的(当然),但Java编译器会将其转换为

INVOKEVIRTUAL Bar.foo
Run Code Online (Sandbox Code Playgroud)

当它是"正常"的Java源代码时.我目前想知道JVM是否实际使用了显式子类型的信息,或者在加载类时是否忽略/优化了它.我想知道,因为验证程序正在计算实际的类型,并且不会让我编写非法的方法调用,我想知道为什么运行时在它已经可用时不会使用这些信息.我特别想知道当超类型是interfaces(INVOKEINTERFACE)时它是否会对性能产生影响,如果JVM无法确定实际类型,则无法使用虚方法表.

我当然可以扩展我的模块,但我需要提供额外的信息,这会使我的代码膨胀,如果它没有效果我不想做.所以我问:类型会影响性能还是JVM会处理这种明确的解决方案?

java jvm bytecode

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

结合Hibernate的自动模式创建和数据库版本控制

我有一个应用程序,当应用程序第一次在计算机上运行时,Hibernate会创建我的所有表模式.这很好用.

然而,我想知道Hibernate是否有某种机制来保持数据库的版本控制,即当我运行不同版本的应用程序并且Hibernate从旧版本中找到不同的数据库模式时,Hibernate是否知道如何将一个模式迁移到另一个模式版本?考虑到Hibernate可以读取现有的模式并且可以将模式与映射描述进行比较,我认为这应该是可能的.但是我不知道如何在创建使用Liquibase/Flyway的更改脚本时告诉Hibernate迁移旧数据.

我可能没有用Google搜索正确的东西,因为Hibernate和版本控制会在审核和字段版本控制方面给你很多点击,但我更多地考虑了Liquibase/Flyway的版本控制.我从来没有考虑过这两者,但由于Hibernate不创建更新脚本而是直接操作数据库,我不知道如何使两者协同工作.

这是我第一次让Hibernate创建我的架构而不是编写我自己的脚本.我这样做是为了利用Hibernate Envers使得手动脚本创建更加繁琐.也许我错过了一些明显的东西.感谢您对此事的任何意见!

更新:我今天和Flyway的开发人员交谈,他告诉我他不会知道一个好的解决方案.也许什么都没有?

hibernate database-versioning

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

使用IntelliJ和源映射启用JavaScript调试

我使用IntelliJ 14.1.4创建JavaScript应用程序.为了调试,我使用Gulp启动了一个Web服务器.然后我启动JavaScript调试并与Chrome连接(通过插件).我可以通过这种方式调试"普通"JavaScript,但是当使用源映射(由browserify创建)时,IntelliJ不再触发断点.如果我使用Chrome的调试工具,一切都按预期工作,但IntelliJ似乎无法转换其断点.

有没有办法让这项工作?我花了很长时间研究这个问题,据我所知,IntelliJ支持源地图.此外,我还能够使用这种使用源映射的方法来调试GWT生成的JavaScript.

更新:似乎此问题存在当前问题.如果知道任何工作环节,我很高兴听到解决方案.


下面的答案解决了这个问题.以下是我设置gulp构建的方法:

bundler.bundle()
    .pipe(exorcist('./build/bundle.js.map', null, null, '../src'))
Run Code Online (Sandbox Code Playgroud)

./build是我生成文件夹,并../src作为JavaScript源文件的根,相对于生成的文件夹.

javascript intellij-idea browserify source-maps

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