有些澄清是需要的,所以我会尝试总结什么影响的问题.
>该项目的目标是为程序员提供一定的功能,最有可能是以一个库的形式(一个带有类文件的JAR,我猜).
>为了使用所述功能,程序员必须符合必须(应该)满足的约束.否则它将无法正常运行(就像java.util.concurrent中的锁一样,必须在适当的时间和地点获取/释放).
>这段代码不会是使用它的应用程序的入口点(即没有main).
> API中暴露的操作数量有限(少).
例子:
想想一个小游戏,几乎所有的东西都由已经实现的类实现和管理.程序员唯一需要做的就是写一个方法,或者说是一些描述人物将会做什么的方法(走走,改变方向,停止,检查对象).我想确保他们的方法(可能标记有注释?)只是走,或者改变方向,或者计算diff = desiredValue – x,而不是写入一些文件,或打开一个套接字连接.
想一个交易经理.经理将由这个图书馆提供,以及一些常规的交易属性(它们的隔离级别,超时,…).现在,程序员想要交易并使用这个经理.我想确保他们只读,写,提交或回滚一些资源,经理知道.如果经理没有控制任何火箭发射,我不希望他们在事务中间发射Rocket.
问题
我想对一个方法(或一组方法)的主体施加一些不变量/限制/约束,稍后由其他程序员在其他一些包/位置中实现.说,我给他们一些东西:
public abstract class ToBeExtended { // some private stuff they should not modify // ... public abstract SomeReturnType safeMethod(); }
对于本项目来说,重要的(可能是必要的)方法体满足一些不变量.或者说,这个方法的实现使用的命令集是有限的.这些约束的例子:
>此方法不得执行任何I / O.
>此方法不得实例化任何未知(潜在危险的)对象.
> …
换个方法:
>这个方法可以调用已知(特定)类的方法.
>这个方法可以执行一些基本的指令(数学,分配局部变量,ifs,循环…).
我一直在看注释,似乎没有什么接近这个.
我的选择到目前为止
>定义一些注释@SafeAnnotation,并将其应用于方法,与实现者定义合同,他将遵循强加的规则,否则系统将发生故障.
>使用允许的操作定义枚举.而不是暴露允许的方法,只有一个方法被公开,它接受这些枚举对象的列表(或类似于Control Flow Graph?),并执行它,让我控制可以做的事情.
例:
public enum AllowedOperations { OP1,OP2 } public class TheOneKnown { public void executeMyStuff (List<AllowedOperations> ops) { // ... } }
我的问题
语言中是否有任何功能,例如注释,反射或其他方式,如果方法有效(即满足我的约束),我可以检查(在编译时或运行时)?
或者说,有没有什么办法强制它只调用一些有限的其他方法?
如果没有(我不认为),这第二种方法是否适合选择?
适合于直观,设计精良和/或良好的做法.
更新(进度)
看了一些相关的问题,我也在考虑(作为第三个选择,也许)按照this question的接受答案给出的步骤.尽管这可能需要对架构进行一些反思.
使用注释来强加限制的整个想法似乎需要实现我自己的注释处理器.如果这是真的,我也可以考虑一个小的域特定语言,以便程序员将使用这些有限的操作,然后将代码转换为Java.这样,我也可以控制指定的内容.
解决方法
>使用一个特定的ClassLoader来加载该类.当心,他们是一种有趣的马,通常会发生类本身由父类加载器加载.可能你想要某种类型的UrlClassLoader,并且父类加载器将被设置为根类加载器这还不够.
>使用线程来避免无限循环(相当于实现Runnable而不是延伸线程,像那里) – 如果你不担心,这可能是不必要的.
>使用SecurityManager避免java.io操作
除了上述之外,我推荐2个选项:
例如:
public void foo(Controller ctrl) { } public class Controller { public boolean commit(); public boolean rollback(); }
这可以给用户一个句柄,允许什么操作.
使用Intent样命令模式
在Android中,系统的组件相当封闭.他们不能直接相互沟通,他们只能发起一个事件,“发生”,或“我想要这样做”.
这样一来,可用命令的集合就没有限制.通常,如果方法只做小业务逻辑,那就够了.