Определение внутреннего класса вне файла Java - PullRequest
5 голосов
/ 31 октября 2010

Я хочу создать класс ClassB как внутренний класс ClassA, но хочу записать вне файла ClassA.java.

Как мне это сделать?

Это будет много внутреннего класса, и ClassA.java файл будет огромный .

ОБНОВЛЕНИЕ Что я действительно хочу сделать, так это определить десять классов, которые будут доступны только одному классу.Все они определены в одном пакете.

Спасибо.

Ответы [ 4 ]

13 голосов
/ 31 октября 2010

Простой ответ: нет, вы не можете.

В силу того, что он является внутренним классом, этот класс должен находиться внутри области родительского класса.

Если ваш класс действительно будет огромным, это, вероятно, говорит о дизайне вашего класса.Вы правильно используете инкапсуляцию?

8 голосов
/ 31 октября 2010

Поместите все свои классы в пакет и определите, что классы являются частными для пакета.

package com.example.here

class Hello{
    //...
}

Обратите внимание на отсутствие ключевого слова public?Вы сможете создать экземпляр класса Hello только в том случае, если создающий его класс находится в пакете com.example.here.

2 голосов
/ 31 октября 2010

ОБНОВЛЕНИЕ
Что я действительно хочу сделать, так это определить десять классов, которые будут доступны только одному классу.Все они определены внутри одного пакета.

Если вы хотите ограничить доступ к одному классу, вы можете поместить их все в новый пакет.Вам также необходимо переместить указанный класс, которому разрешен доступ, в этот пакет.Для новых классов вы можете ограничить доступ, используя уровень доступа по умолчанию (без модификатора public / private / protected).Это сделает их доступными только для классов в их пакете.Указанный класс, которому разрешен доступ, можно сделать общедоступным, чтобы его можно было использовать вне этого нового пакета.

Примечание. У вас есть возможность ограничить видимость класса или видимость конструктора.

1 голос
/ 06 апреля 2017

Попробуйте следующее ...

  • Передать ссылку внешнего класса на no-long-inner-class
  • Используйте пакеты и сделайте пакет больше не внутренним классом приватным (ответ Джереми)
  • В очень редких случаях может быть лучше пойти с внутренними классами, и в то же время заставить их работать в другом месте. Если это действительно вы, пожалуйста, читайте дальше ...

Как сохранить внутренние классы маленькими

а) Расширение от внешних классов

class Outer {

    class SomeInnerClass extends SomeClass {
        // More specific code here
    }
}

class SomeClass {
    // A lot of generic code here (in a different file)
}

б) Используйте абстрактные методы

Одна из (более правильных) причин использования внутренних классов, как правило, связана с использованием точного экземпляра внешнего класса. Для общего решения этого вопроса в базовом классе используйте абстрактные методы получения.

abstract class SomeClass {

    protected abstract SpecificData getSpecificData();

    void someMethod() {
        SpecificData specificData = getSpecificData();

        // Do work with the "specific data" here ...
    }
}


class Outer {

    private SpecificData mSpecificData = new SpecificData();

    class SomeInnerClass extends SomeClass {

        @Override
        protected SpecificData getSpecificData() {
            return OuterClass.mSpecificData;
        }
    }
}

Я думаю, что вы поняли идею ... Вы могли бы также рассмотреть использование некоторого класса или интерфейса GeneralData (в пределах SomeClass) вместо этого, и сделать так, чтобы getSpecificData() возвратил более конкретный (убывший) его экземпляр.

Опять же: это может быть ужасно неправильно использовано для создания очень плохого нечитаемого кода, но оно также может быть использовано для очень хороших скороговорок при правильных обстоятельствах, в любом случае оно должно отвечать на исходный вопрос.

...