Java 阻止API用户使用某些方法

Java 阻止API用户使用某些方法,java,oop,exception,architecture,Java,Oop,Exception,Architecture,嗨,我正在用java实现一个给定的设计。基本上,我有一个称为base的抽象类,还有一些具体的类,它们扩展base并从不同的包实现接口。每个具体类将实现不同的接口。现在,这些接口包含基于事件和非基于事件的方法签名。我的问题是,;我只希望在我的具体类中实现非基于事件的方法,但是因为implements关键字java迫使我插入一个自动生成的方法体,它基本上返回null。他们以后可能会实现这些基于事件的方法,但现在不会。让API用户知道这些方法不包含实现的适当方式是什么。这是我的想法 使用不推荐的关键字

嗨,我正在用java实现一个给定的设计。基本上,我有一个称为base的抽象类,还有一些具体的类,它们扩展base并从不同的包实现接口。每个具体类将实现不同的接口。现在,这些接口包含基于事件和非基于事件的方法签名。我的问题是,;我只希望在我的具体类中实现非基于事件的方法,但是因为implements关键字java迫使我插入一个自动生成的方法体,它基本上返回null。他们以后可能会实现这些基于事件的方法,但现在不会。让API用户知道这些方法不包含实现的适当方式是什么。这是我的想法

  • 使用不推荐的关键字
  • 创建一个异常类并在方法内部抛出该异常,并让API用户处理它

  • 我没有对现有架构进行更改的选择。任何想法都值得赞赏。谢谢。

    您可以创建自己的界面,其中列出您希望组件用户能够访问的所有方法。将此作为他们使用的唯一接口,其他公共方法将不可见。

    选项(2)很好,但当您遵循接口时,您将需要未检查的异常。并将这些方法记录为未实施

    弃用意味着历史记录,即它可以工作,但不应再使用。由于您明确声明这些方法不起作用,因此将其标记为已弃用不会阻止使用,也不会表明这些方法未实现。

    根据,弃用API的原因包括

    • 它是不安全的、有缺陷的或效率很低的
    • 它将在未来的版本中消失
    • 它鼓励糟糕的编码实践
    两者都不适合你的情况

    就个人而言,我倾向于抛出标准库已经提供的

    指示不支持请求的操作


    对我来说,这听起来更像你真正想要的。

    我建议使用一些混合设计模式。这将帮助您高效地解决这个问题,并使代码具有可维护性

    根据我的知识,您可以在这里使用抽象工厂模式。请参见下图中的设计草图

    子类1和子类2中的Method1和method2是应该公开的,而子类1和子类2中的method3和method4是我们不想公开的

    根据子类中方法的性质,创建Genericsubclass接口并在此接口中创建一些方法。例如:我在这个接口中创建了一个名为nonEventbasedmethod1的方法

    创建一个对应于每个子类的工厂,每个工厂将实现GenericSubclass接口。然后,在子类1Factory中实现nonEventbasedmethod1方法类似于

    nonEventbasedmethod1(){
        subclass1.method1();
    }
    
    nonEventbasedmethod1(){
        subclass2.method3();
    }
    
    在子类2Factory中实现非EventBasedMethod1方法类似于

    nonEventbasedmethod1(){
        subclass1.method1();
    }
    
    nonEventbasedmethod1(){
        subclass2.method3();
    }
    
    然后创建一个子类抽象工厂,该工厂将返回其中一个子类工厂,然后不必担心返回了哪个工厂(在返回相应工厂之前,该决定已在子类抽象工厂中作出)只需从GenericSubclass接口调用所需的方法,就会调用子类1或子类2的其中一个方法


    希望这有帮助。

    < P>如果您抛出一个“NoBuffor”或“NoMimPrimEnter”异常的例外情况,请考虑(在Org.Apache .Con)的异常。BR>
    但是,我会重新考虑重新审视您的设计,看看您是否可以避免这种情况——也许您需要定义另一个接口,该接口将保存始终实现的方法,并在另一个接口中对其进行扩展(或者提供一个没有对上一个接口进行扩展的接口)对于您不总是实施的方法。

    某种类型的
    未实施的
    异常,以及彻底记录这些方法当前不起任何作用且不应使用的事实,可能是最佳方法。或者
    不支持操作异常
    似乎确实是一个理想的候选方法:“抛出以指示请求的操作不受支持。”当我添加该异常时,最后一行返回null会给出一个编译错误,因为它不可访问。我知道的唯一解决方案是if(true)throw…。这是一种合适的方法吗?