加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

在Java中强加方法体的约束或限制

发布时间:2020-12-14 16:43:38 所属栏目:Java 来源:网络整理
导读:上下文(编辑) 有些澄清是需要的,所以我会尝试总结什么影响的问题. 该项目的目标是为程序员提供一定的功能,最有可能是以一个库的形式(一个带有类文件的JAR,我猜). 为了使用所述功能,程序员必须符合必须(应该)满足的约束.否则它将无法正常运行(就像java.util.c
上下文(编辑)

有些澄清是需要的,所以我会尝试总结什么影响的问题.

>该项目的目标是为程序员提供一定的功能,最有可能是以一个库的形式(一个带有类文件的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.这样,我也可以控制指定的内容.

解决方法

我认为方向 in this question是好的.

>使用一个特定的ClassLoader来加载该类.当心,他们是一种有趣的马,通常会发生类本身由父类加载器加载.可能你想要某种类型的UrlClassLoader,并且父类加载器将被设置为根类加载器这还不够.
>使用线程来避免无限循环(相当于实现Runnable而不是延伸线程,像那里) – 如果你不担心,这可能是不必要的.
>使用SecurityManager避免java.io操作

除了上述之外,我推荐2个选项:

给方法一个控制器,它将包含它可以调用的功能

例如:

public void foo(Controller ctrl) {
}

public class Controller {
   public boolean commit();
   public boolean rollback();
}

这可以给用户一个句柄,允许什么操作.

使用Intent样命令模式

在Android中,系统的组件相当封闭.他们不能直接相互沟通,他们只能发起一个事件,“发生”,或“我想要这样做”.

这样一来,可用命令的集合就没有限制.通常,如果方法只做小业务逻辑,那就够了.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读