Tag: 构造函数

PowerMock的expectNew()并没有按预期模拟构造函数

我正在尝试学习各种模拟库的细节, PowerMock (特别是EasyMock扩展)是下一个列表。 我试图模拟一个构造函数,当我尝试复制它们时,提供的示例没有相同的响应。 据我所知,它从不嘲笑构造函数,只是继续进行,就像它是正常的一样。 这是测试类: @RunWith(PowerMockRunner.class) @PrepareForTest({Writer.class}) public class FaultInjectionSituationTest { @Test public void testActionFail() throws Exception { FaultInjectionSituation fis = new FaultInjectionSituation(); PowerMock.expectNew(Writer.class, “test”) .andThrow(new IOException(“thrown from mock”)); PowerMock.replay(Writer.class); System.out.println(fis.action()); PowerMock.verify(Writer.class); } } 我尝试用EasyMock.isA(String.class)替换“test”,但它产生了相同的结果。 这是FaultInjectionSituation: public class FaultInjectionSituation { public String action(){ Writer w; try { w = new Writer(“test”); } catch (IOException […]

哪个先运行? 实例变量或超级构造函数的默认值?

根据SCJP6(页577),我发现实例变量在超类构造函数完成之前被赋予了默认值,我在Debugg模式中尝试了一个例子,但我看到超级承包商在实例变量获取其默认值之前运行,可以任何一个解释那对我来说? 用例以防万一有人想尝试一下: package courseExercise; class test { test() { System.out.println(“Super Constructor run”); } } public class Init extends test { private Integer i = 6; private int j = 8; Init(int x) { super(); System.out.println(“1-arg const”); } Init() { System.out.println(“no-arg const”); } static { System.out.println(“1st static init”); } public static int d = 10; { […]

当构造函数具有inheritance时,“构造函数不能应用于给定类型”

这是我的基类: abstract public class CPU extends GameObject { protected float shiftX; protected float shiftY; public CPU(float x, float y) { super(x, y); } 这是它的一个子类: public class Beam extends CPU { public Beam(float x, float y, float shiftX, float shiftY, int beamMode) { try { image = ImageIO.read(new File(“/home/tab/Pictures/Beam”+beamMode+”.gif”)); } catch (Exception e) { e.printStackTrace(); } […]

拥有没有任何构造函数的JVM字节码类是否有效?

AFAIK,Java中的隐式构造函数总是为没有构造函数的类生成[1] , [2] 。 但在字节码中,我无法在JVMS上找到这样的限制。 所以: 根据JVMS来定义一个没有构造函数的类只有在下面的jasmin hello世界中使用它的静态方法是有效的吗? 除了无法创建它的实例之外还有其他任何后果吗? 根据https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html#jvms-4.10.2.4 ,我将无法使用invokespecial来初始化实例,这会使new无用。 (不能使用未初始化的对象)。 Jasmin代码: .class public Main .super java/lang/Object .method public static main([Ljava/lang/String;)V .limit stack 2 getstatic java/lang/System/out Ljava/io/PrintStream; ldc “Hello World!” invokevirtual java/io/PrintStream/println(Ljava/lang/String;)V return .end method 也就是说, 没有构造函数: .method public ()V aload_0 invokenonvirtual java/lang/Object/()V return .end method ? 使用java Main运行会给出预期的输出Hello World! 。 我检查了javap -v输出,与Java不同, jasmin没有生成默认构造函数。 […]

强制GSON使用特定的构造函数

public class UserAction { private final UUID uuid; private String userId; /* more fields, setters and getters here */ public UserAction(){ this.uuid = UUID.fromString(new com.eaio.uuid.UUID().toString()); } public UserAction(UUID uuid){ this.uuid = uuid; } @Override public boolean equals(Object obj) { if (obj == null) { return false; } if (getClass() != obj.getClass()) { return false; } […]

Java:为什么反序列化不会调用构造函数以及什么是最佳解决方法?

Java 1.5的Java序列化规范说: 对于可序列化对象,运行第一个非可序列化超类型的no-arg构造函数。 对于可序列化的类,字段将初始化为适合其类型的默认值。 然后通过调用类特定的readObject方法来恢复每个类的字段,或者如果未定义这些方法,则通过调用defaultReadObject方法来恢复。 请注意,在反序列化期间,不会对可序列化类执行字段初始值设定项和构造函数。 但是,这意味着如果我们在类中放置一个静态变量(例如计数器变量),它将不会像通常那样更新: class Foo { static int t; public Foo() { t++; } } public class Bar extends Foo implements Serializable { static int t; public Bar() { t++; } } 在这种情况下,如果反序列化了一个Bar实例,那么Foo的计数器是正确的, Bar的计数器是一个一个。 我想知道为什么反序列化不会调用构造函数? 由于看起来虽然这会在速度上获得一点点,但它可能会导致潜在的问题。 编译器可以很容易地设计为生成一个“静态构造函数”,它只更新将要更新的静态变量,并且在加载类时不依赖于外部信息。 另外,我想知道避免这种情况的最佳方法是什么? 我能想到的解决方案是使用静态变量上的操作打包反序列化。 感谢提前输入!

Java:在构造函数中抛出exception,我的对象是否仍然可以创建?

你可以告诉我,当exception抛出构造函数并且对象不为null时,可能会出现这种情况。 我的意思是对象的某些部分被创建,而另一部分则没有。就像这样 public Test(){ name = “John”; // exception // init some other data. } 我理解在这个sitiation对象Test中会为null,但可以是对象测试不能为null的情况(删除exception块不能回答:))?

最合适的边界检查 – 构造函数或setter?

对Java来说还是比较新的,我想知道哪个是处理这个问题的更好方法。 我有一个类构造函数,它接受一些参数,在这个类中也是公共getter和setter: private String name; private Float value; public MySampleClass(String theName, Float theValue) { setName(theName); setValue(theValue); } public void setName(String n) { this.name = n; } public value setValue(Float v) { this.value = v; } 我想对这个Float做一些检查。 看起来最好把它放在setter中: public value setValue(Float v) { if (v 1.0f) { this.value = 1.0f; } } 这段代码最初在构造函数中检查了边界,并在setter中再次检查,这似乎是多余的。 我更改了构造函数以调用setter并将检查放在那里。 那更有意义吗? 或者我违反了一些我完全不知道的惯例?

为什么还可以使用空白构造函数?

我最近正在阅读一些Java并且遇到了一些新东西(一个成语?)对我来说是新的:在程序中,具有多个构造函数的类也总是包含一个空白构造函数。 例如: public class Genotype { private boolean bits[]; private int rating; private int length; private Random random; public Genotype() { // <= THIS is the bandit, this one right here random = new Random(); } /* creates a Random genetoype */ public Genotype(int length, Random r) { random = r; this.length = length; bits […]

C ++和Java对象模型之间的差异

在Java中,序列化对象非常容易。 在C ++中,只有它们像C结构(没有多态性) memcpy对象安全(?)。 在C ++中, 如果编译器能够生成默认(普通)复制构造函数,那么为什么它不能生成自动序列化的代码? 在Java中,只能从ctor访问静态函数和数据成员。 在C ++中,我可以愉快地使用ctor中的非静态成员和函数。 在Java中,我可以在类中初始化内联的数据成员。 在C ++中,这是一个编译错误。 在Java中,我可以初始化ctor中的final成员。 在C ++中,我必须在初始化列表中初始化const成员。 在C ++中,当控制到达ctor的主体时,所有成员ctor都运行了,对吧? 在Java中,ctor可以调用另一个ctor。 在C ++中,我们不能这样做。 在Java中, this在ctor返回之后无效(逃避this引用,multithreading中的错误)。 什么时候在C ++中有效? 这在C ++和Java中都很容易逃脱: 在ctor (观察者模式)中向一个监听器注册一个尚未构造的对象 。 在Java中,我不能在派生类中创建基类private的公共函数。 我很惊讶地发现在C ++中它是可行的甚至是有用的。 任何人都可以对这些差异做出简短的解释吗? 更新。 到目前为止,试图收集答案。 Boost有一些类似序列化的支持。 (托尼) 尽管我搞砸了这一点,但Alf P. Steinbach给出了一个有趣的例子。 C ++ 0x将支持比C ++ 98更实用的初始化。 (Alf P. Steinbach)#3在C ++ 0x中是合法的(Ken Bloom) 在构造函数的{body}开始执行时,保证在构造函数自己的类中声明的数据成员已完全构造。 (C ++ […]