小编Yis*_*hai的帖子

适用于Java的数据流编程API?

我正在寻找一个Java的数据流/并发编程API.
我知道有DataRush,但它不是免费的.我特别感兴趣的是多核数据处理,而不是分布式的,它排除了MapReduceHadoop.
有什么想法吗?
谢谢,罗洛

java concurrency multicore dataflow

8
推荐指数
2
解决办法
3336
查看次数

java.lang.ArrayIndexOutOfBoundsException:0 - 大于索引的数组?

抛出的异常是否表明数组大于索引?如果没有,这是什么意思,为什么?我该如何纠正?


线程"main"中的异常java.lang.ArrayIndexOutOfBoundsException:0在leapyear.LeapYear.main(LeapYear.java:13)


public class LeapYear {

public static void main(String[] args) { 
    int year = Integer.parseInt(args[0]);
    boolean isLeapYear;

    // divisible by 4
    isLeapYear = (year % 4 == 0);

    // divisible by 4 and not 100
    isLeapYear = isLeapYear && (year % 100 != 0);

    // divisible by 4 and not 100 unless divisible by 400
    isLeapYear = isLeapYear || (year % 400 == 0);

    System.out.println(isLeapYear);
}
}
Run Code Online (Sandbox Code Playgroud)

java arrays exception

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

如何避免使用Mocks重复逻辑

我有以下挑战,我没有找到一个好的答案.我正在使用Mocking框架(在本例中为JMock),以允许单元测试与数据库代码隔离.我正在模拟对涉及数据库逻辑的类的访问,并使用DBUnit单独测试数据库类.

我遇到的问题是我注意到逻辑在概念上在多个地方重复的模式.例如,我需要检测数据库中的值不存在,因此在这种情况下我可能会从方法返回null.所以我有一个数据库访问类来进行数据库交互,并适当地返回null.然后我有业务逻辑类,它从模拟接收null,然后测试如果值为null则适当地执行.

现在如果将来行为需要改变并且返回null不再合适,比如因为状态变得更加复杂,那么我将需要返回一个报告值不存在的对象以及一些其他事实来自数据库.

现在,如果我在这种情况下将数据库类的行为更改为不再返回null,那么业务逻辑类仍然会起作用,并且该错误只会在QA中捕获,除非有人记住耦合,或者正确地遵循了方法的用法.

我失去了一些东西,我必须有一个更好的方法来避免这种概念上的重复,或者至少让它受到测试,这样如果它发生变化,变化没有传播的事实就不能通过单元测试.

有什么建议?

更新:

让我试着澄清一下我的问题.我正在考虑代码何时随着时间的推移而发展,如何确保集成不会在通过模拟和模拟代表的类的实际实现测试的类之间中断.

例如,我只有一个案例,我有一个最初创建的方法,并没有期望空值,所以这不是对真实对象的测试.然后,在某些情况下,类的用户(通过模拟测试)被增强以传入null作为参数.在破坏的集成上,因为真正的类没有测试为null.现在,在构建这些类时,这并不是什么大不了的事,因为你在构建时测试两端,但如果设计需要在两个月之后发展,当你倾向于忘记细节时,你将如何测试之间的交互这两组对象(通过模拟与实际实现测试的对象)?

潜在的问题似乎是重复(即违反DRY原则),期望实际上保留在两个地方,虽然关系是概念性的,没有实际的重复代码.

[在Aaron Digulla对他的回答进行第二次编辑后编辑]:

是的,这正是我正在做的事情(除了在通过DBUnit测试的类中与DB进行进一步的交互,并且在测试期间与数据库交互,但它是相同的想法).所以现在,我们需要修改数据库行为,以便结果不同.使用模拟的测试将继续通过,除非1)有人记得或2)它在集成中断.因此,数据库的存储过程返回值(比如)基本上在模拟的测试数据中重复.现在困扰我的重复是逻辑是重复的,它是对DRY的微妙违反.它可能就是这样(毕竟有一个集成测试的原因),但我感觉到我错过了一些东西.

[编辑开始赏金]

阅读与Aaron的互动得到了问题的重点,但我真正想要的是如何避免或管理明显的重复,以便真正的类的行为的变化将显示在与模拟交互的单元测试作为破坏的东西.显然,这不会自动发生,但可能有一种方法可以正确设计场景.

[关于授予赏金的编辑]

感谢所有花时间回答问题的人.获胜者告诉我一些关于如何考虑在两层之间传递数据的新内容,并首先得到答案.

unit-testing mocking code-duplication

7
推荐指数
2
解决办法
1682
查看次数

Java邮政地址解析器

此问题有些相关,但在没有任何关于QuickBooks的答案的情况下,有没有人知道Java的地址解析器?可以采取非结构化地址信息并解析地址行1,2和城市州邮政编码和国家/地区的东西?

java parsing street-address

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

如何在JBoss 4.2中强制重新编译jsps?

我在质量保证的JBoss 4.2上遇到了这种令人讨厌的行为,我想在我们投入生产之前将其扼杀在萌芽状态并找到其他一些极端情况.

jsp调用具有以下签名的方法:

 public void methodName(String arg)
Run Code Online (Sandbox Code Playgroud)

这被改为:

 public void methodName(String arg, Object... args)
Run Code Online (Sandbox Code Playgroud)

预先存在的JSP通过以下方式调用此方法:

 methodName("param");
Run Code Online (Sandbox Code Playgroud)

在部署修改后的代码时,JBoss没有重新编译JSP,这导致了QA崩溃.向jsp添加一个愚蠢的注释修复了问题(JBoss认识到JSP已更改并重新编译它).

JBoss上有设置强制重启时重新编译JSP吗?

编辑:为了澄清答案中的一些要点,设置是JSP是战争的一部分,这是一个耳朵的一部分.耳朵里有所有类,在一个罐子里.

关于预编译的愿望,如果系统不认为jsp需要编译,会预编译强制重新编译吗?它似乎并非如此.这里的错误不是一个compliation错误,它是一个方法调用错误,因为"更改"(在字节代码级别,而不是真正在代码级别)方法签名.

附录:请注意,我们最近在生产中遇到过,即使已经接受了答案的标志设置,JSP也没有重新编译,即使JSP确实发生了变化.那里的主要错误,但无论如何,JBoss正常关闭.此时它将成为JBoss的旧版本,但如果您仍在使用它,则删除工作内容和tmp目录是唯一可靠的方法.

我并没有改变接受的答案,因为它确实达到了问题的目的.JBoss错误是一个单独的问题.

java jboss jsp recompile

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

将Guice和JMock一起使用的最佳方法是什么?

我已经开始使用吉斯做一个项目的一些依赖注入,主要是因为我需要注入嘲笑(使用JMock的目前)层从单元测试,这使得人工注射非常尴尬了.

我的问题是引入模拟的最佳方法是什么?我目前所拥有的是在单元测试中创建一个满足依赖关系的新模块,并将它们绑定到如下所示的提供者:

public class JMockProvider<T> implements Provider<T> {
    private T mock;

    public JMockProvider(T mock) {
        this.mock = mock;
    }

    public T get() {
        return mock;
    }
}
Run Code Online (Sandbox Code Playgroud)

在构造函数中传递mock,因此JMock设置可能如下所示:

    final CommunicationQueue queue = context.mock(CommunicationQueue.class);
    final TransactionRollBack trans = context.mock(TransactionRollBack.class);
    Injector injector = Guice.createInjector(new AbstractModule() {
        @Override
        protected void configure() {
            bind(CommunicationQueue.class).toProvider(new JMockProvider<QuickBooksCommunicationQueue>(queue));
            bind(TransactionRollBack.class).toProvider(new JMockProvider<TransactionRollBack>(trans));
        }
    });
    context.checking(new Expectations() {{
        oneOf(queue).retrieve(with(any(int.class)));
        will(returnValue(null));
        never(trans);
    }});
    injector.getInstance(RunResponse.class).processResponseImpl(-1);
Run Code Online (Sandbox Code Playgroud)

有没有更好的办法?我知道,AtUnit试图解决这个问题,虽然我失去了它是如何自动奇迹般地注入这是本地创建像上面的一个模拟,但是我正在寻找无论是令人信服的理由,AtUnit是正确的答案在这里(其他而不是在不改变测试的情况下改变DI和模拟框架的能力,或者是否有更好的解决方案来手动完成.

java guice jmock

7
推荐指数
1
解决办法
3787
查看次数

明确完成了哪些Java设计来支持向后兼容性?

由于这个问题又回到四票即将结束,我再次尝试提出一个更为狭隘的问题,希望社群能够更好地看待.

Java中的哪些特定设计决策被记录为不是因为这是首选的设计决策,而是因为必须支持向后兼容性.

显而易见的情况是泛型,您无法在运行时检测类型参数.(所以你做不到:

 public void addEmptyMember(List<?> someList) {
      if (someList instanceof List<String>) {
            ((List<String>) someList).add("");
      }
 }
Run Code Online (Sandbox Code Playgroud)

语言设计和标准API中还有哪些其他类似的例子?

java backwards-compatibility

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

如何在1.6中禁用JTable中的所有排序代码

我有一个JTable扩展,自项目中的Java 1.3/1.4以来一直在使用,通过单击列提供列重新排序和排序等功能.我们正在升级到Java 1.6,新的JTable阻止旧的排序代码工作.将所有内容都安装到新的JTable API上会有一些广泛的返工.在那之前有没有办法在JTable中完全禁用这些添加?

编辑:在进一步调查之后,问题集中在这样一个事实:标题上的鼠标事件被1.6中的Swing吞噬,并且没有传递给表实现,即使它设置了自己的标题呈现.非常适合吹嘘的Java向后兼容性.

那么有没有办法让JTable 1.6停止?我无法做到.甚至覆盖表上的UI和表头也无济于事.

java swing jtable jdk1.6 java-6

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

在应用服务器的生产中使用 Google Guice 的正确阶段是什么?

这似乎是一个奇怪的问题(显而易见的答案是 Production,废话),但是如果您阅读 java 文档:

/**
  * We want fast startup times at the expense of runtime performance and some up front error
 * checking.
 */
DEVELOPMENT,

/**
 * We want to catch errors as early as possible and take performance hits up front.
 */
PRODUCTION
Run Code Online (Sandbox Code Playgroud)

假设您对应用程序服务器进行无状态调用,初始接收方法(或其他方法)会在每次调用时创建新的注入器。如果在给定的调用中不需要所有模块绑定,那么使用 Development 阶段(这是默认值)而不是预先考虑性能似乎会更好,因为您可能永远不会接受它,这里“前期”和“运行时性能”之间的区别有点没有实际意义,因为它是一个调用。

当然,这样做的缺点似乎是您将丢失错误检查,从而导致潜在的代码路径出人意料地引起问题。

所以问题归结为上述假设是否正确?当注入器的给定生命周期是一次调用时,您会在大量模块上节省性能吗?

java performance guice

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

字段是否需要显式最终才能拥有"适当的"不可变对象?

您经常阅读有关不可变对象的信息,这些对象要求最终字段在Java中不可变.实际上是这种情况,还是仅仅是没有公开可变性而实际上没有改变状态?

例如,如果你有一个由构建器模式构建的不可变对象,你可以通过让构建器在构建时分配各个字段,或让构建器自己保存字段并最终通过将值传递给返回不可变对象来实现.它的(私有)构造函数.

使字段最终具有防止实现错误的明显优势(例如允许代码保留对构建器的引用和多次"构建"对象,而实际上是在改变现有对象),但让Builder将其数据存储在构建的对象似乎是DRYer.

所以问题是:假设Builder没有提前泄漏Object并且一旦构建就停止修改对象(例如通过将其对象的引用设置为null),实际上在""中获得了任何改进(例如改进的线程安全性)如果对象的字段是最终的,那么对象的不变性?

java immutability

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