我正在试图窥探一个Object,我想在构造函数调用之前存根一个由构造函数调用的方法.
我的班级看起来像这样:
public class MyClass {
public MyClass() {
setup();
}
public void setup() {
}
}
Run Code Online (Sandbox Code Playgroud)
不得调用安装方法.那么,我如何监视这个方法(和存根设置,以便它什么都不做)?
它可以很好地模拟方法,但我想进行单元测试MyClass,所以我需要其他方法.
之所以需要存根设置方法以便它什么都不做:
我正在编写一个乐高机器人(lejos)并且我在设置中放置了一些机器人需要工作的代码.但是,当我在TinyVM(安装在机器人上的VM)之外调用它时,java崩溃,因为VM尚未正确初始化(因为测试在我的PC上运行).对于单元测试,设置并不重要.
我不能存根类/方法设置调用,因为它们中的一些是公共静态最终变量.
有人可以向我解释为什么我在getRowCount()方法中得到NullPointerException吗?使用空ArrayList初始化变量...
public class BeschriftungssetTableModel extends DefaultTableModel {
private static final long serialVersionUID = -4980235976337188354L;
private List<BeschriftungssetBean> data = new ArrayList<>();
public void setData(List<BeschriftungssetBean> data) {
this.data = data;
}
@Override
public int getColumnCount() {
return 1;
}
@Override
public int getRowCount() {
return data.size();
}
@Override
public Object getValueAt(int row, int column) {
return data.get(row).getBezeichnung();
}
@Override
public String getColumnName(int column) {
return "Bezeichnung";
}
public static void main(String[] args) {
BeschriftungssetTableModel beschriftungssetTableModel = new BeschriftungssetTableModel();
beschriftungssetTableModel.getRowCount();
}
}
public …Run Code Online (Sandbox Code Playgroud) 我有以下设置,它给我一条消息,指出"构造函数调用Overridable方法".我知道这种情况正在发生,但我的问题是如何修复它以便代码仍然有效并且消息消失了.
public interface Foo{
void doFoo();
}
public class FooImpl implements Foo{
@Override{
public void doFoo(){
//.. Do important code
}
}
public class Bar{
private FooImpl fi;
public Bar(){
fi = new FooImpl();
fi.doFoo(); // The message complains about this line
}
}
Run Code Online (Sandbox Code Playgroud)
谢谢!
从父类调用子方法是好/坏的做法?
class Parent {
constructor() {
// if 'autoPlay' exists (was implemented) in chain
if (this.autoPlay) {
this.autoPlay(); // execute from parent
}
}
}
class ChildA extends Parent {
autoPlay() {
console.log('Child');
}
}
class ChildB extends Parent {
// 'autoPlay' wasn't implemented
}
const childA = new ChildA();
const childB = new ChildB();
Run Code Online (Sandbox Code Playgroud) 请参考下面的Java代码:
class Base{
Base(){
System.out.println("Base Constructor");
method();
}
void method(){}
}
class Derived extends Base{
int var = 2;
Derived(){
System.out.println("Derived Constructor");
}
@Override
void method(){
System.out.println("var = "+var);
}
}
class Test2{
public static void main(String[] args) {
Derived b = new Derived();
}
}
Run Code Online (Sandbox Code Playgroud)
看到的输出是:
Base Constructor
var = 0
Derived Constructor
Run Code Online (Sandbox Code Playgroud)
我认为var = 0的发生是因为Derived对象是半初始化的; 类似于Jon Skeet在这里所说的
我的问题是:
如果尚未创建Derived类对象,为什么会调用重写的方法?
在什么时间点,var赋值为0?
是否存在需要此类行为的用例?
我试图创建一个构造函数,将一个字段作为参数,然后将其放在一个存储在超类中的字段中.这是我正在使用的代码
public crisps(String flavour, int quantity) {
this.flavour = super.getFlavour();
this.quantity = quantity;
}
Run Code Online (Sandbox Code Playgroud)
在超类中,我用字段初始化了字段
private String flavour;
Run Code Online (Sandbox Code Playgroud)
我有一个访问方法
public String getFlavour() {
return flavour;
}
Run Code Online (Sandbox Code Playgroud)
我收到一个错误" 风味在超类中有私人访问权限 ",但我相信这应该无关紧要,因为我调用了将其返回到字段的访问器方法?
我需要在构造函数结束后调用一个方法,我不知道该怎么做.我有这门课:
Class A {
public A() {
//...
}
public void init() {
//Call after the constructor
}
}
Run Code Online (Sandbox Code Playgroud) Java相当新,希望在使用setter / getters并使用toString方法创建输出时存储乘客详细信息方面有所帮助。
The problem I have is, say I am storing the passengers phone number and don't want their phone number to contain any characters, have a length of 10 numbers and start with 1 and return "Not Valid" if one of these occur.
I have tried to create if statements in the setter but it is not returning the "Not Valid". This is what I have so far
public class Passenger {
private String name;
private String location; …Run Code Online (Sandbox Code Playgroud) 在Java程序中,我有多个继承自父类的子类(它是抽象的).我想表达的是,每个孩子都应该有一个只设置一次的成员(我打算从构造函数中做到这一点).我的计划是编码s.th. 像这样:
public abstract class Parent {
protected final String birthmark;
}
public class Child extends Parent {
public Child(String s) {
this.birthmark = s;
}
}
Run Code Online (Sandbox Code Playgroud)
然而,这似乎不能取悦Java神.在父类中,我收到birthmark"可能尚未初始化" 的消息,在子类中我得到" birthmark无法访问最终字段".
那么Java的方式是什么呢?我错过了什么?
我有这样的事情:
public abstract class Menu {
public Menu() {
init();
}
protected abstract void init();
protected void addMenuItem(MenuItem menuItem) {
// some code...
}
}
public class ConcreteMenu extends Menu {
protected void init() {
addMenuItem(new MenuItem("ITEM1"));
addMenuItem(new MenuItem("ITEM2"));
// ....
}
}
//Somewhere in code
Menu menu1 = new ConcreteMenu();
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,超类的init方法是抽象的,并且在创建对象后由构造函数自动调用.
我很好奇我是否可以遇到像这样的代码的某些问题,当我需要创建一些这样的结构时,其结构不会及时更改.
会有更好的方法吗?它适用于Java,但它可以在C++和ActionScript中使用吗?
谢谢你的答案.
java ×9
constructor ×2
accessor ×1
ecmascript-6 ×1
final ×1
inheritance ×1
javascript ×1
mocking ×1
mockito ×1
overriding ×1
spy ×1
subclass ×1
superclass ×1
swing ×1
unit-testing ×1