2014-10-29 3 views
1

getPlugin() 메서드를 작성하여 다른 클래스의 기본 클래스를 가져올 수 있습니다.다른 클래스를 가져 오는 중 문제가 발생했습니다.

public class Main extends JavaPlugin { 
    public Main getPlugin() { 
     return this; 
    } 
} 

public class Arena { 
    private Main plugin = Main.getPlugin(); 
} 

... 이클립스 나에게 다음과 같은 오류 제공

하지만 호출 할 때 ... :

Cannot make a static reference to the non-static method getPlugin() from the type Main

내가 정적 사용했다,하지만 정적 나를 준다 문제는 여러 곳에서 발생합니다. 정적은 대개 물건을 만드는 나쁜 방법입니다. 메모리 누출 등이 발생합니다.

나는 getters와 setters를 사용해 보았지만, 그것들 역시 정적 일 필요가 있습니까? 사용하고있는 코드가 매우 엉망이며 다른 클래스에 액세스하는 더 깨끗한 방법을 찾고 싶습니다.

+0

정적 사용이 나쁘지 않다 . 그것은 많은 유스 케이스를 가지고있다. Static은 클래스의 모든 인스턴스가 static으로 선언 한 모든 변수 또는 메소드를 공유한다는 것을 의미합니다. – brso05

+0

getPlugin() 메서드가 해당 클래스의 인스턴스에만 해당하지 않으면 Static을 사용해야합니다. – brso05

+0

'static '이 무엇인지 그리고 언제 사용하는 것이 적절한 지 이해해야합니다. 정적인지 아닌지, 반드시 getPlugin() 메소드를 * 호출 *해야 할 필요가있다. –

답변

1

정적 메서드를 사용하지 않으려면 변수를 매개 변수로 개체 생성자에 전달해야합니다.

public class Arena { 
    private final Main plugin; 
    public Arena(Plugin plugin) { 
     this.plugin = plugin; 
    } 
} 

을 그리고 당신은 당신의 주요 플러그인 클래스에서 경기장을 만들 수 있으며, 매개 변수로 this 전달 : 귀하의 예제에서는 다음과 같이 작동합니다

public class Main extends JavaPlugin { 
    @Override 
    public void onEnable() { 
     Arena arena = new Arena(this); 
    } 
} 
0

이 문제는 JavaPlugin 수퍼 클래스에 이미 getPlugin() 메서드가 있기 때문에 발생합니다. 따라서 Main.getPlugin()을 수행 할 때 비 정적 인 개체를 호출하려고합니다. 또한 자신의 메서드는 정적이 아닙니다.

내가하는 방법은 다음과 같습니다. 다른 이름을 사용하고 정적으로 만들어야합니다. 또한 onEnable()에 해당 값을 초기화해야합니다.

public final class Example extends JavaPlugin { 
    private static Plugin main; 
    public static Plugin getMain() { 
     return main; 
    } 
    @Override 
    public void onEnable() { 
     main = this; 
    } 
} 
+0

getPlugin()을 다른 것으로 변경하려고했지만 여전히 작동하지 않았습니다. 그것은 같은 오류를 주었다. 나는 또한 초기화하려고 시도했다 – Yupie

+0

@ 유피 당신은 정적으로 만들었습니까? –

+0

아, 아니,하지만 문제가 해결, 나는 그것을 해결하기 위해 @Afforess '방법을 사용! – Yupie

관련 문제