Я пытаюсь сделать игру Tetris, и я получаю ошибку компилятора
Shape is not an enclosing class
когда я пытаюсь создать объект
public class Test {
public static void main(String[] args) {
Shape s = new Shapes.ZShape();
}
}
Я использую внутренние классы для каждой фигуры. Вот часть моего кода
public class Shapes {
class AShape {
}
class ZShape {
}
}
Что я делаю неправильно ?
java
inner-classes
В Себи
источник
источник
new Shape().new ZShape();
, КлассZShape
нуждается в включающем экземпляре для создания экземпляра.AShape
иZShape
расширить базовый классShapes
. Вложение классов не очень хороший дизайн для этой проблемы.Ответы:
ZShape
не является статическим, поэтому он требует экземпляра внешнего класса.Самое простое решение - создать ZShape и любой вложенный класс,
static
если вы можете.Я также сделал бы любые поля
final
илиstatic final
что вы можете также.источник
ZShape
static
полностью побеждает цель того, что он пытается сделать, который является экземпляром копииZShape
.static
делает это проще, а не сложнее.ZShape myShape = new Shape().instantiateZShape();
. Это подразумевает, что ZShape, который вы получаете, не существует без Shape, что является намерением здесь.Предположим, что RetailerProfileModel - это ваш главный класс, а RetailerPaymentModel - это внутренний класс внутри него. Вы можете создать объект класса Inner вне класса следующим образом:
источник
underTest = Mockito.mock(Outer.class).new InnerNonStaticClass();
Я хотел бы предложить не преобразовывать нестатический класс в статический класс, потому что в этом случае ваш внутренний класс не может получить доступ к нестатическим членам внешнего класса.
Пример :
Итак, в таком случае вы можете сделать что-то вроде:
источник
Outer.Inner obj = new Outer().new Inner();
()
обязательно. Тем не менее, C, C ++ это не обязательно. Вот пример, который не работает. Более того, я нашел этот пост . который объясняет больше о грамматике в Java и как они анализируются. Я хотел бы увидеть пример, когда этот синтаксис работает для вас.Как указано в документации :
источник
Иногда нам нужно создать новый экземпляр внутреннего класса, который не может быть статическим, поскольку он зависит от некоторых глобальных переменных родительского класса. В этой ситуации, если вы попытаетесь создать экземпляр внутреннего класса, который не является статическим, выдается
not an enclosing class
ошибка.Принимая пример вопроса, что если
ZShape
не может быть статическим, потому что ему нужна глобальная переменнаяShape
класса?Как вы можете создать новый экземпляр
ZShape
? Вот как:Добавьте геттер в родительский класс:
Доступ к нему так:
источник
источник
Я столкнулся с той же проблемой. Я решил, создав экземпляр для каждого внутреннего публичного класса. Что касается вашей ситуации, я предлагаю вам использовать наследование, отличное от внутренних классов.
тогда вы можете новый Shape (); и посетите ZShape через shape.zShape;
источник
Не нужно делать вложенный класс статическим, но он должен быть публичным
источник
При чтении принятого ответа я сначала не осознал, что сделать статический внутренний класс - это то же самое, что переместить его в отдельный класс.
Таким образом, при получении ошибки
Вы можете решить это одним из следующих способов:
static
ключевое слово во внутренний класс илиисточник
Если родительский класс одноэлементный, используйте следующий способ:
где
getInstance()
будет возвращать синглтон-объект родительского класса.источник
Чтобы выполнить требование из вопроса, мы можем поместить классы в интерфейс:
а затем использовать как автор пытался раньше:
Если мы ищем правильное «логическое» решение, следует использовать
fabric
шаблон проектированияисточник