我有一些需要大量堆空间运行的Junit单元测试 - 即1G.(他们为仅在足够的堆空间运行的webstart应用程序测试内存密集型功能,并且将在Win 7 64位计算机上内部运行 - 因此重新设计测试并不是一个实用的建议.)
我在Intellij IDEA中开发,所以我知道我可以为测试类设置JVM参数(例如-Xmx1024M).但是,这仅用于运行整个测试类 - 如果我想运行单独的测试,我必须重新创建该测试方法的运行配置.
此外,这些是IDE和特定于盒子的 - 所以如果我切换盒子(我在多台机器上开发)或者我的一个同事试图运行测试,那么这些设置不会被转移.(此外,我的同事也使用其他IDE,如Eclipse和NetBeans.)FWIW,我们使用mercurial进行源代码控制.
对于构建周期,我们使用Maven,所以我知道如何为此指定JVM参数.
所以: - 我正在寻找一种方法来指定适用于整个测试类和各个测试方法的JVM参数; - 我想在任何机器上的IDE之间共享这些规范(从存储库中获取代码).
我有一个定义不可变值类型的类,我现在需要序列化.不变性来自构造函数中设置的最终字段.我已经尝试过序列化,它的确有效(令人惊讶的是?) - 但我不知道如何.
这是该课程的一个例子
public class MyValueType implements Serializable
{
private final int value;
private transient int derivedValue;
public MyValueType(int value)
{
this.value = value;
this.derivedValue = derivedValue(value);
}
// getters etc...
}
Run Code Online (Sandbox Code Playgroud)
鉴于该类没有没有arg构造函数,它如何实例化并设置最终字段?
(旁边 - 我注意到这个类特别是因为IDEA没有为这个类生成"no serialVersionUID"检查警告,但是成功地为我刚刚可序列化的其他类生成了警告.)
如果在Java中创建泛型类(该类具有泛型类型参数),您可以使用泛型方法(该方法采用泛型类型参数)吗?
请考虑以下示例:
public class MyClass {
public <K> K doSomething(K k){
return k;
}
}
public class MyGenericClass<T> {
public <K> K doSomething(K k){
return k;
}
public <K> List<K> makeSingletonList(K k){
return Collections.singletonList(k);
}
}
Run Code Online (Sandbox Code Playgroud)
正如您所期望的泛型方法,我可以调用任何对象的doSomething(K)实例MyClass:
MyClass clazz = new MyClass();
String string = clazz.doSomething("String");
Integer integer = clazz.doSomething(1);
Run Code Online (Sandbox Code Playgroud)
但是,如果我尝试使用MyGenericClass 没有指定泛型类型的实例,我调用doSomething(K)返回一个Object,无论K传入什么:
MyGenericClass untyped = new MyGenericClass();
// this doesn't compile - "Incompatible types. Required: String, Found: Object" …Run Code Online (Sandbox Code Playgroud) 这是一个问题,第一个代码清单编译得很好(JDK 1.6 | JDK 1.7):
ArrayList<String> a = new ArrayList<String>();
String[] s = a.toArray(new String[0]);
Run Code Online (Sandbox Code Playgroud)
但是,如果我将List引用声明为原始类型:
ArrayList a = new ArrayList();
String[] s = a.toArray(new String[0]);
Run Code Online (Sandbox Code Playgroud)
我收到编译器错误,说明String[]是必需的,但是Object[]找到了.
这意味着我的编译器将泛型方法解释为返回,Object[]尽管String[]它接收了一个as参数.
我加倍检查了toArray(myArray)方法签名:
<T> T[] toArray(T[] a);
Run Code Online (Sandbox Code Playgroud)
因此,它是一个参数化方法,其类型参数<T>与List(即<E>)的类型参数无关.
我不知道在这里使用原始类型如何影响使用独立类型参数的参数化方法的评估.
下面是一些使用Java 6编译但不能在Java 7中编译的代码的简单示例.
public class Test<T extends Test> {
private final int _myVar;
public Test(int myVar) {
_myVar = myVar;
}
public int get(TestContainer<T> container){
T t = container.get();
return t._myVar;
}
private static class TestContainer<T extends Test> {
private final T _test;
private TestContainer(T test) {
_test = test;
}
public T get(){
return _test;
}
}
}
Run Code Online (Sandbox Code Playgroud)
在Java 7中,它无法在get(TestContainer<T> container)方法中编译,错误如下:
错误:_myVar在Test中具有私有访问权限
我不明白为什么这不再编译 - 在我看来它应该.变量t是类型T,必须扩展Test.它试图从类中访问_myVar实例的字段.TestTest
实际上,如果我将方法更改为get(TestContainer<T> …
jsr-310有一个方便的类DateTimeFormatters,允许你构建一个DateTimeFormatter.我特别喜欢这个pattern(String)方法 - 请参阅javadoc
但是,我遇到了一个问题,即这是区分大小写的 - 例如
DateTimeFormatters.pattern("dd-MMM-yyyy");
Run Code Online (Sandbox Code Playgroud)
与"01-Jan-2012"匹配,但不与"01-JAN-2012"或"01-jan-2012"匹配.
一种方法是断开字符串并解析组件,或者另一种方法是使用Regex用区分大小写的字符串替换不区分大小写的字符串.
但感觉应该有一个更简单的方法......
我继承了一个Java项目,其中包含许多未根据UpperCamelCase命名约定命名的类.
缩写就是这种情况(例如HTMLButton而不是HtmlButton).虽然我知道CamelCase与缩写的使用存在一些意见分歧,但我们希望切换为仅使用大写字母作为缩写的第一个字母.(目前,似乎有几个同时命名的约定.)
我想整理一下.我们使用Mercurial作为源代码存储库并在Windows机器上工作(包括XP,Vista,7).但是,如果我将类名从HTMLButton更改为HtmlButton,Mercurial会将其识别为类名更改,但不会将其更改为文件名.(随后Mercurial的任何提取都不会取消文件名更改.)
我知道Windows可以在不区分大小写的文件系统上工作,我知道Mercurial在接受来自Windows机箱的推送时会选择这个功能......
所以......: - 我可以更改设置以使Mercurial使用区分大小写的文件名吗? - 我是否可以更改设置以使Windows使用区分大小写的文件名?(这些是单独的问题.我的首要任务是让Mercurial接受文件名更改,如有必要,我们可以在IDE中手动强制文件重命名.但是,直接的解决方案将是首选!)
(如果所有其他方法都失败了,我可能会尝试将HTMLButton重命名为HtmlButtonA,提交并推送,并将HtmlButtonA重命名为HtmlButton,然后执行另一次提交并推送...但是,我不确定这会对Windows文件名产生什么影响其他人在第二次推后只做了一次拉动...)
我正在使用Intellij IDEA来处理Java项目.
当我在Intellij中构建时,我发现我得到了很多误报,但只有在存在其他编译错误时 - 例如我已经做了一些更改并期望出现一些编译错误,所以我构建以找到所有错误.(在这个例子中,我更改了一个广泛使用的接口,并希望编译器捕获错误,以便我知道要修复哪些实现.)除了一些预期的错误之外,Intellij报告了数百个误报(这使得它很难找到真正的错误 - 目前编译器每次只显示一个真正的编译错误,所以我必须重建才能找到下一个错误...).这些错误的编译错误没有突出显示 - 实际上,它们不是真正的编译错误.(如果我通过Maven编译,它们也不会出现.)
最常见的错误是"无法找到符号类[X]",尽管该类通常位于同一个项目中.
我试过: - 升级Intellij(从10.5.1升级到10.5.2到11.0.1) - 使缓存失效并重建缓存 - 重新启动Intellij ......但都没有效果.
我搜索了Intellij Bug跟踪板,但是没有找到任何对此的引用,所以想知道这是否是用户错误(如果是,我需要更改哪些设置)?
还有其他人经历过这样的事吗?如果是这样,你是如何解决的?
Java中存在一些内部类扩展外部类的情况.
例如,java.awt.geom.Arc2D.Float是java.awt.geom.Arc2D的内部类,并且还扩展了Arc2D.(参见http://download.oracle.com/javase/6/docs/api/java/awt/geom/Arc2D.Float.html)
此外,sun.org.mozilla.javascript.internal.FunctionNode.Jump扩展了sun.org.mozilla.javascript.internal.Node,它是FunctionNode的超类.(抱歉......找不到javadoc的链接)
对我来说,这似乎很奇怪.你能创建这些吗?
new Arc2D.Float.Float() //n.b. I couldn't get this to compile in Intellij IDEA;
new FunctionNode.Jump.Jump.Jump(1); // I could get this to compile
Run Code Online (Sandbox Code Playgroud)
将子类嵌套为超类的内部类有什么作用?
我想知道是否要访问超类中的某些东西,但是如果你想访问父类中的任何变量/方法,你可以使用
super.variable;
Run Code Online (Sandbox Code Playgroud)
要么
super.method();
Run Code Online (Sandbox Code Playgroud)
编辑1:jjnguy建议将逻辑保持在同一个地方.在这种情况下,为什么不写一个文件com.mypackage.AbstractTest:
abstract class AbstractTest {
abstract String getString();
}
class ExtensionTest extends AbstractTest {
@Override
String getString() {
return "hello world";
}
}
Run Code Online (Sandbox Code Playgroud)
... 而不是:
abstract class AbstractTest {
abstract String getString();
class ExtensionTest extends AbstractTest {
@Override
String getString() {
return "hello world";
}
}
}
Run Code Online (Sandbox Code Playgroud)
编辑2:正确地指出我之前编辑中的建议存在缺陷,因为无法在包之外构建ExtensionTest.但是,周末我对此有了进一步的考虑,那么下面呢: …
我知道如何使用PDFBox来阅读整个pdf文件的文本PDFTextStripper.getText(PDDocument).
我还有一个关于如何使用特定页面获取对象引用的示例PDDocumentCatalog.getAllPages().get(i).
如何使用PDFBox获取一个页面的文本,因为我在PDPage课堂上没有看到任何这样的方法?