【问题标题】:Is the following "private static inner class" implementation correct?以下“私有静态内部类”实现是否正确?
【发布时间】:2014-02-11 05:34:24
【问题描述】:

我创建了一个公共的“Utils”类,我在其中放置了一些常用的静态方法。 在那个 Utils 类中,我创建了一个私有静态内部类,它是 Utils 提供的一些“工具”。 (该工具是满足我需要的某种解析器)。 Utils 中的方法之一,返回该解析器的新实例,一切正常。 “问题”是我收到警告,对于解析器内的每个 public 方法,不是从包含的 Utils 类调用的。

这是它的外观骨架:

public class Utils 
{
    public static Parser(String[] msgs) throws Exception
    {
        return Parser.create(msgs);
    }

    private static class Parser
    {       
        /** fields... **/

        private Parser()
        {}

        public static Parser create(String[] msgs) throws Exception
        {
            Parser parser = new Parser();
            setupParser(msgs);
            return parser;
        }

        private static void setupParser(String[] msgs) throws Exception
            { // do stuff 
            }

        public boolean someInnerMethod(String key)
            {
            // do stuff
            }
     }
}

方法someInnerMethod引发警告:

Utils.Parser 类型的方法 someInnerMethod(String) 永远不会在本地使用

我做错了吗?有没有更好的方法来做我在这里所做的事情? 我通常希望 Parser 不能从外部访问,但可以使用静态方法获得它(我不想每次需要它的方法时都实例化 Utils 类)

提前致谢。

【问题讨论】:

  • 您的一个“做事”评论正在评论结束}。但这可能只是因为您删除了不相关的代码
  • 你真的需要一个内部类吗? Parser 是否仅在 Utils 内部使用?

标签: java static-methods inner-classes static-class private-class


【解决方案1】:

这是不正确的。您将无法使用您的类 - 您不能在静态工厂方法中使用返回值(现在它不会编译,但我猜返回值应该是 Parser)。返回值的可见性使得任何使用您的工厂方法的人都无法访问它。

一种解决方法是提取内部类实现的公共接口并将其用作工厂方法的返回值。

【讨论】:

  • 该类也可以公开。它的构造函数是私有的。
  • 感谢您的评论。我确实尝试了这种解决方法 - 但后来我“失去”了对 Parser 中所有“公共”方法的访问权限。将对象从接口转换为Parser 也不是一种选择,因为它不可见。我通常想要做的是允许 Parser 对象仅在 Utils 中创建,但要从外部类中检索,使用 Utils 中的一些静态方法,然后当然可以接近它的公共方法。
  • @AndroidNewbie 塞巴斯蒂安的意思是,通过在返回的接口中包含您的公共方法,调用者可以访问接口定义中包含的那些方法。
【解决方案2】:

虽然方法是公共的,但类本身是私有的,因此这些方法实际上是私有的,因为它们只能从包含的类中访问。您的 IDE 似乎将它们视为与 private 方法相同,如果您定义了一个从未调用过的方法,则会警告您。

附:顺便说一句,没有“静态内部类”之类的东西-术语“内部类”是指非静态嵌套类,其实例只能存在于容器的特定实例的上下文中,因此类不能同时是staticinner

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-17
    • 2013-10-22
    • 2011-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多