둘러싼 클래스 Java가 아님
테트리스 게임을 만들려고하는데 컴파일러 오류가 발생합니다.
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 {
}
}
내가 도대체 뭘 잘못하고있는 겁니까 ?
ZShape 정적이 아니므로 외부 클래스의 인스턴스가 필요합니다.
가장 간단한 해결책은 가능한 static경우 ZShape 및 중첩 클래스를 만드는 것 입니다.
나는 또한 어떤 분야를 만들 final거나 static final당신도 할 수 있습니다.
RetailerProfileModel이 기본 클래스이고 RetailerPaymentModel이 그 내부 클래스라고 가정하십시오. 다음과 같이 클래스 외부에서 Inner 클래스의 객체를 만들 수 있습니다.
RetailerProfileModel.RetailerPaymentModel paymentModel = new RetailerProfileModel().new RetailerPaymentModel();
내가 제안하는 것은 비 정적 클래스를 정적 클래스로 변환하지 않는 것입니다.이 경우 내부 클래스는 외부 클래스의 비 정적 멤버에 액세스 할 수 없기 때문입니다.
예 :
class Outer
{
class Inner
{
//...
}
}
따라서 이러한 경우 다음과 같은 작업을 수행 할 수 있습니다.
Outer o = new Outer();
Outer.Inner obj = o.new Inner();
문서에 명시된 바와 같이 :
OuterClass.InnerClass innerObject = outerObject.new InnerClass();
때로는 부모 클래스의 일부 전역 변수에 의존하기 때문에 정적 일 수없는 내부 클래스의 새 인스턴스를 만들어야 할 때가 있습니다. 이 상황에서 정적이 아닌 내부 클래스의 인스턴스를 작성하려고하면 not an enclosing class오류가 발생합니다.
질문의 예를 들어, 클래스의 ZShape전역 변수가 필요하기 때문에 정적 일 수 없다면 Shape어떻게됩니까?
새 인스턴스를 ZShape어떻게 만들 수 있습니까? 방법은 다음과 같습니다.
부모 클래스에 게터를 추가하십시오.
public ZShape getNewZShape() {
return new ZShape();
}
다음과 같이 액세스하십시오 :
Shape ss = new Shape();
ZShape s = ss.getNewZShape();
Shape shape = new Shape();
Shape.ZShape zshape = shape.new ZShape();
같은 문제가 발생했습니다. 모든 내부 공개 클래스에 대한 인스턴스를 작성하여 해결했습니다. 상황에 관해서는 내부 클래스 이외의 상속을 사용하는 것이 좋습니다.
public class Shape {
private String shape;
public ZShape zShpae;
public SShape sShape;
public Shape(){
int[][] coords = noShapeCoords;
shape = "NoShape";
zShape = new ZShape();
sShape = new SShape();
}
class ZShape{
int[][] coords = zShapeCoords;
String shape = "ZShape";
}
class SShape{
int[][] coords = sShapeCoords;
String shape = "SShape";
}
//etc
}
다음 새 Shape () 수 있습니다; shape.zShape를 통해 ZShape를 방문하십시오.
중첩 클래스를 정적으로 만들 필요는 없지만 공개해야합니다.
public class Test {
public static void main(String[] args) {
Shape shape = new Shape();
Shape s = shape.new Shape.ZShape();
}
}
허용 된 답변을 읽을 때 처음에 몰랐던 한 가지는 내부 클래스를 정적으로 만드는 것이 기본적으로 별도의 클래스로 옮기는 것과 동일하다는 것입니다.
따라서 오류가 발생하면
xxx는 둘러싸는 클래스가 아닙니다
다음 방법 중 하나로 해결할 수 있습니다.
static내부 클래스에 키워드를 추가 하거나- 그것을 별도의 클래스로 옮기십시오.
부모 클래스가 싱글 톤 인 경우 다음과 같이 사용하십시오.
Parent.Child childObject = (Parent.getInstance()).new Child();
여기서 getInstance()부모 클래스 싱글 톤 객체를 반환합니다.
질문에서 요구 사항을 달성하기 위해 클래스를 인터페이스에 넣을 수 있습니다.
public interface Shapes {
class AShape{
}
class ZShape{
}
}
그런 다음 전에 시도한 저자로 사용하십시오.
public class Test {
public static void main(String[] args) {
Shape s = new Shapes.ZShape();
}
}
적절한 "논리적"솔루션을 찾고 있다면 fabric디자인 패턴을 사용해야합니다
참고 URL : https://stackoverflow.com/questions/20252727/is-not-an-enclosing-class-java
'development' 카테고리의 다른 글
| 오류 : 기본 클래스를 찾거나로드 할 수 없습니다. (0) | 2020.03.02 |
|---|---|
| github.com 사용자에게 메시지를 남기는 방법 (0) | 2020.03.02 |
| HTML의 새 탭에서 링크를 여는 방법은 무엇입니까? (0) | 2020.03.02 |
| Linux에서 cURL을 사용하는 HTTP POST 및 GET (0) | 2020.03.02 |
| ASP.NET Core에서 사용자 정의 AuthorizeAttribute를 어떻게 작성합니까? (0) | 2020.03.02 |