0

我目前正在制作一个简单的可插件程序。我的问题是我不想让插件访问所有基本插件字段/方法。例如:

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?
    }
}
4

3 回答 3

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 并且您不希望插件修改它,则您的构造函数应该复制它并将其包装在不可修改的 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 的列表。

于 2013-06-20T22:54:51.663 回答
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
}
于 2013-06-20T22:55:04.810 回答
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);
  }

}
于 2013-06-20T22:55:09.993 回答