Install4j:如何检查运行无效的RemoteCallable

时间:2018-01-24 14:44:29

标签: java singleton install4j

我的安装程序在安装过程中将一些信息存储在单例类中。现在,我注意到在提升动作中,单例类没有相同的实例。到目前为止,我还没有找到任何解决方法/解决方案,以便它们共享同一个实例。所以,我已经决定确保如果有人想获得单例的实例,他们必须从一个不高的环境中调用。让我们说单身人士如下所示:

public class InvestigatorReport {

    private final List<Report> reports = new ArrayList<>();
    private final static InvestigatorReport INSTANCE = new InvestigatorReport();

    private InvestigatorReport() {
        MyLogger.logInfo(getClass(), "initiating...");
    }

    public static InvestigatorReport getInstance(Context context) {
        if (context.hasBeenElevated()) {
            throw new IllegalAccessError(
                    "this method must be called unelevated!");
        }
        return INSTANCE;
    }

    private boolean addReport(Report report) {
        return reports.add(report);
    }
 }

但问题是,在某些情况下,我必须从提升的动作类调用此添加报告。所以我在我的提升动作类中尝试了以下内容:

if (context.hasBeenElevated()) {
            return (Boolean) context.runUnelevated(new RemoteCallable() {
                @Override
                public Serializable execute() {
                    return getInstance(context).addReport(report);
                }
            });
        }

但是,正如您可以看到我是否将相同的上下文对象从提升的操作类传递给RemoteCallable类,即使我正在运行未升级的类,context.hasBeenElevated()仍然返回true 。

除了上下文之外,还有其他方法可以检查高程级别吗?如果你有任何其他更好的想法阻止任何人调用单身getInstance()方法,我都是耳朵。

1 个答案:

答案 0 :(得分:0)

我会使用不同的模式。使单例的所有方法都是静态的,并使用runUnelevated调用包装数据访问:

public static boolean addReport(Report report, Context context) {
    context.runUnelevated(new RemoteCallable() {
        @Override
        public Serializable execute() {
             InvestigatorReport.reports.add(report);
             return null;
        }
    });
}

通过这种方式,您可以从提升和未提升的代码调用方法,而无需在呼叫站点检查任何内容。