Java 如何设计内部方法访问范围?

Java 如何设计内部方法访问范围?,java,design-patterns,frameworks,Java,Design Patterns,Frameworks,我们有一个大约20个类的小型轻量级框架,由50多名开发人员和半大型代码库使用。为了保持框架的小型化,我们避免了创建太多的接口、抽象类等。这是一种折衷方法,可以加快新开发人员的适应速度,同时保持代码的低复杂性 因此,我们不使用内部/外部接口或大量使用工厂类。我们依靠几个带有公共/私有方法的类来定义作用域。然而,有时方法必须是公共的,但只能由框架而不是开发人员访问 例如: public class Logger public boolean isDebugEnabled() {...}

我们有一个大约20个类的小型轻量级框架,由50多名开发人员和半大型代码库使用。为了保持框架的小型化,我们避免了创建太多的接口、抽象类等。这是一种折衷方法,可以加快新开发人员的适应速度,同时保持代码的低复杂性

因此,我们不使用内部/外部接口或大量使用工厂类。我们依靠几个带有公共/私有方法的类来定义作用域。然而,有时方法必须是公共的,但只能由框架而不是开发人员访问

例如:

public class Logger
    public boolean isDebugEnabled() {...}
    public void enableDebug() {...}
if (!Logger.isDebugEnabled) {
    Logger.enableDebug(); // screw the javadoc - i'm enabling debug logging
}
public void enableDebugInternal() or _enableDebug() or $enableDebug() 
enableDebug是一个“内部”框架方法,文档中有“请勿使用-内部类”。由于框架结构的原因,该方法不能是私有的,也不能在包范围内

开发人员偶尔会错过javadoc并调用一个内部方法,这可能会在运行时产生意外的结果

例如:

public class Logger
    public boolean isDebugEnabled() {...}
    public void enableDebug() {...}
if (!Logger.isDebugEnabled) {
    Logger.enableDebug(); // screw the javadoc - i'm enabling debug logging
}
public void enableDebugInternal() or _enableDebug() or $enableDebug() 
框架团队认为最好的方法是按照某种约定命名它们。这不会引入编译时安全性,但会降低错误概率

例如:

public class Logger
    public boolean isDebugEnabled() {...}
    public void enableDebug() {...}
if (!Logger.isDebugEnabled) {
    Logger.enableDebug(); // screw the javadoc - i'm enabling debug logging
}
public void enableDebugInternal() or _enableDebug() or $enableDebug() 

/**
* Internal method - do not use
*/
public void enableDebug() 
他们考虑的另一个选择是将所有内部方法包装到一个内部类中:

public class Logger
    public boolean isDebugEnabled() {...}
    public class Internal {
        public void enableDebug() {...}
    }
你能推荐一个更好的方法吗? 最好是提供编译时安全性的东西

编辑:我要找的是java中C#的关键字“internal”的设计模式:

嗯,你基本上回答了你自己的问题。您无法更改访问级别,因此您几乎必须更改它的名称。有点不成熟,但你也可以反对这种方法。汉克雷斯特做了些什么。。。犯错误有趣的。。。为此目的

如果您希望强制在包之外不使用它,那么您需要在构建过程中进行某种静态分析。如果我别无选择,我会编写一个Maven插件来查找用法

最终,如果您有一个公共方法,它需要像包私有的那样工作,那么听起来您的设计是错误的


无论如何,您不应该编写自己的日志外观,尤其是在编写框架时。您应该使用。

这个问题与日志记录无关,它只是我使用的一个示例。其次,我要寻找的范围不是包私有的,而是jar私有的。我去核对一下火柴interface@KelvinWayne使用Java9模块系统,这将是可行的,除非我们目前仍停留在JavaV8上,没有升级计划(目前)