Правильна ли следующая реализация "частного статического внутреннего класса"?
Я сделал общедоступный класс "Utils", где я поместил некоторые общие статические методы, которые часто используются. Внутри этого класса 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
поднимает предупреждение:
Метод someInnerMethod(String) из типа Utils.Parser никогда не используется локально
Я делаю что-то неправильно? Есть ли лучший способ сделать то, что я сделал здесь? Я обычно хочу, чтобы Parser не был доступен извне, но получить его можно было бы с помощью статического метода (я не хочу создавать экземпляр класса Utils каждый раз, когда мне нужны его методы)
Заранее спасибо.
2 ответа
Это не правильно. Вы не сможете использовать свой класс - вы не можете использовать возвращаемое значение в статическом методе фабрики (сейчас он не будет компилироваться, но я предполагаю, что возвращаемое значение должно быть Parser
). Видимость возвращаемого значения делает его недоступным для всех, кто использует ваш фабричный метод.
Обходной путь может заключаться в выделении открытого интерфейса, который реализует внутренний класс, и использовании его в качестве возвращаемого значения для вашего метода фабрики.
Хотя методы являются общедоступными, сам класс является закрытым, поэтому эти методы фактически являются закрытыми, так как они доступны только внутри содержащего класса. Ваша IDE, кажется, рассматривает их так же, как private
методы, предупреждающие вас, если вы определите тот, который никогда не вызывается.
PS, кроме этого, не существует такого понятия, как "статический внутренний класс" - термин "внутренний класс" относится к нестатическому вложенному классу, экземпляры которого могут существовать только в контексте определенного экземпляра контейнера, поэтому класс не может быть одновременно статичным и внутренним.