以下“私有静态内部类”实现是否正确?

时间:2014-01-21 14:44:28

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

我创建了一个公共的“Utils”类,我在其中放置了一些常用的 static 方法。 在Utils类中,我创建了一个私有的静态内部类,它是Utils提供的一些“工具”。 (那些工具是我需要的某种解析器)。 Utils中的一个方法,返回该解析器的一个新实例,一切正常。 “问题”是我在解析器中的每个公共方法都收到警告,而不是从包含的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类)

提前致谢。

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:2)

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

P.S。顺便说一句,没有“静态内部类”这样的东西 - 术语“内部类”指的是一个非静态嵌套类,其实例只能存在于容器的特定实例的上下文中,所以类不能同时是静态内部