545 words
3 minutes
[Minecraft] 메인 인스턴스를 효과적으로 관리하자
이 포스트에서는JAVA 언어에 대한 기본적인 이해와 OOP를 코드에 적용할 수 있는 정도의 실력이 기본적으로 요구됩니다.
버킷에서 anyMethod(Plugin plugin, …)
요런 모양의 함수들을 많이 보게 될 것이다. 처음 접하는 사람은 ”????????? plugin은 뭐야?” 이럴 텐데 이때 우리는 JavaPlugin 즉 이것을 상속받은 MainClass의 인스턴스를 넘겨주면 되는 것이다.
아니 근데 이것을 그냥 넘겨줄 것인가? 자 한번 비교해보자
일단 instance를 사용할 클래스 하나를 만들어 주겠다.
이름은 ListenerManager
로 EventListener
의 역할을 하도록 해주겠다.
public class ListenerManager implements Listener {
private Main instance;
public ListenerManager(Main instance){
this.instance = instance;
}
@EventHandler
public void onJoin(PlayerJoinEvent event){
Player p = event.getPlayer();
for(Player player : Bukkit.getOnlinePlayers()){
if(player.equals(p)) continue;
p.hidePlayer(this.instance, player);
}
}
}
이렇게 해줌으로써 한 유저가 서버에 접속하게 되면, 다른 유저들에게는 보이지 않게되도록 만들었다. 이때 싱글톤을 사용하지 않은 instance는 지금처럼 하나하나 각 인스턴스마다 연결해줘야하는 엄청나게 불편함이 존재한다.(또 성능적으로도 좋지 않다, 제일 안 좋은 것은 미적으로 안 좋다.)
@Override
public void onEnable() {
PluginManager pm = Bukkit.getPluginManager();
ListenerManager listenerManager = new ListenerManager(this);
pm.registerEvents(listenerManager, this);
}
이렇게 작성할 수 있겠다. 그런데 만약 인스턴스를 사용하는 클래스가 많고, 여러곳에서 많이 쓰일때는??
엄청나게 안 좋은 코딩의 시작인 것이다.
그래서 우리는 더욱 간단한 방법을 사용한다.
public final class Main extends JavaPlugin{
private static Main instance;
@Override
public void onEnable() {
instance = this;
ListenerManager listenerManager = new ListenerManager();
pm.registerEvents(listenerManager, this);
}
public static Main getInstance(){
return instance;
}
}
이렇게 작성 후 리스너도 바꿔준다.
public class ListenerManager implements Listener {
@EventHandler
public void onJoin(PlayerJoinEvent event){
Player p = event.getPlayer();
for(Player player : Bukkit.getOnlinePlayers()){
if(player.equals(p)) continue;
p.hidePlayer(Main.getInstance(), player);
}
}
}
이렇게 해주면 가독성도 높아지고, 아주 좋은 코딩을 할 수 있다.
다음에는 이제 스케쥴링에 대해서 배우도록 하겠다.(with scoreboard)
[Minecraft] 메인 인스턴스를 효과적으로 관리하자
https://compy07.github.io/Blog/posts/development/bukkit/util/maininstance/