我目前正在制作一个简单的可插件程序。我的问题是我不想让插件访问所有base-plugin字段/方法。例如:
public abstract class BasePlugin {
private int x; //Mysterious x
public abstract void update(); //update func that may need x, but can't change it
protected final int getX() {return x;} //x accessor
}
除非你意识到没有办法设置x,否则这会有效。
我该怎么办?我想让子类(插件)无法更改x,但让它读取值。在创建时,值应该至少可以访问一次(这就足够了)。
编辑:构造函数在大多数情况下都有效,但如果我有例如:
public abstract class BasePlugin {
private List<int> x; //Mysterious x
public abstract void update(); //update func that may need x, but can't change it
protected final List<int> getX() {return x;} //x accessor
public BasePlugin(List<int> y) {x = y;}
}
public class Plugin {
public Plugin(List<int> y)
{
super(y);
y.remove(0); //Will it work?
}
}
答案 0 :(得分:2)
允许抽象类具有构造函数,因此您可以为BasePlugin创建无参数构造函数:
public abstract class BasePlugin {
private int x; //Mysterious x
public BasePlugin() {
x = 42;
}
public abstract void update(); //update func that may need x, but can't change it
protected final int getX() {return x;} //x accessor
}
现在,当创建一个插件时,x被设置为42.您甚至不需要对插件进行任何代码更改以使它们使用此构造函数。
要回答编辑过的问题:如果x是一个List并且您不希望插件修改它,那么构造函数应该将其复制并将其包装在unmodifiable list中。否则,任何插件都可以调用getX().add(myObject)
。
public BasePlugin(List<int> y) {
List<int> temp = new ArrayList<int>();
Collections.copy(temp, y); // shallow copy of the list
this.x = Collections.unmodifiableList(temp);
}
现在,如果插件的构造函数是
public Plugin(List<int> y)
{
super(y);
y.remove(0); //Will it work?
}
它对BasePlugin的列表没有任何影响。
答案 1 :(得分:1)
您可以添加构造函数以使子类初始化您的属性:
public abstract class BasePlugin {
private int x; //Mysterious x
public BasePlugin(int x) {
this.x = x;
}
public abstract void update(); //update func that may need x, but can't change it
protected final int getX() {return x;} //x accessor
}
答案 2 :(得分:1)
您可以使用构造函数注入。
public abstract class BasePlugin{
private int x;
public BasePlugin(int x){
this.x=x;
}
public abstract void update(); //update func that may need x, but can't change it
protected final int getX() {return x;} //x accessor
}
在你的孩子身上
public class Plugin extends BasePlugin{
public Plugin(int x){
super(x);
}
}