私はMinecraftサーバー用の簡単な刑務所システムを実装しています。
刑務所はオブジェクトで、彼らは自分のID、内部のプレイヤーの数と場所を持っています。コールバックを使用するオブジェクトを作成するメソッド
新しい刑務所を作成する簡単な方法を作成したいと思います。
public static Jail createJail(final Location location);
このメソッドは、自動的に(すべての非同期を実行します)私のDBhelperを使用してDBに新たに作成された刑務所を挿入して、何かが失敗した場合、代わりに刑務所オブジェクトのnullを返す必要があります。私の内部の匿名クラス内で何かを返すことができないので、コールバックと匿名クラスで簡単なCallBackインターフェイスを実装するのは当然の問題です。ここで
は、私がこれまで持っているものです。
/**
* Create new Jail object, fill with values and register in List
* @param id Unique id of Jail, usually got from DB
* @param location Location of Jail
*/
private Jail(final int id, final Location location) {
this.id = id;
this.location = location;
this.amountOfJailed = 0;
jails.add(id, this);
}
/**
* Tries to create new Jail<br />
* New Jail will be auto-inserted into DB.
* @param location Valid Bukkit Location
* @return Jail if successfully created, null otherwise
*/
public static Jail createJail(final Location location) {
if (location == null) {
Bukkit.getLogger().warning(Lang.PREFIX + " Tried to create new Jail with invalid location");
return null;
}
final Jail newJail;
DatabaseQuery db = new DatabaseQuery();
db.insertJail(location, new SimpleCallBack() {
@Override
public void onQueryDone(ResultSet result) {
if (result == null) {
newJail = null;
} else {
result.next();
int usedId = result.getInt("id");
newJail = new Jail(usedId, location);
}
}
});
return newJail;
}
とのDatabaseQuery#insertJail
/**
* Inserts Jail into DB<br />
* When any error happens, callBack will receive null ResultSet<br />
* When everything goes well, ResultSet will hold generated id
* @param location Location of inserted Jail
* @param callBack Class with 'onQueryDone' method to be executed
*/
public void insertJail(final Location location, final SimpleCallBack callBack) {
new BukkitRunnable() {
@Override
public void run() {
ResultSet result = null;
try
{
Connection connection = hikari.getConnection();
PreparedStatement statement = connection.prepareStatement("INSERT INTO p_jails (`location`) VALUES (?);");
statement.setString(1, Serializer.location_serialize(location));
statement.executeUpdate();
result = statement.getGeneratedKeys();
} catch (SQLException e) {
e.printStackTrace();
}
final ResultSet fResult = result;
new BukkitRunnable() {
@Override
public void run() {
callBack.onQueryDone(fResult);
}
}.runTask(Main.coreapi);
}
}.runTaskAsynchronously(Main.coreapi);
}
は、どのように私は、メソッドcreateJail
を実装することが出来るのですか?私はそれがDBに正常に挿入されたかどうかを知る必要があり、ResultSetから使用されたIDを取得する必要があるので、最終的にその刑務所オブジェクトを返し、 "ID###の新しい刑務所を作成しました"
そのわずか非常にシンプルなインターフェース'void onQueryDone(ResultSet result);'メソッド –
最初の 'BukkitRunnable'はそれをAsyncにするためです。その後、私は時にはBukkitのティックスレッドと呼ばれる同期スレッドにコールバックします。2つのメソッドに分割すると、 'createJail'メソッド内から' Jail'オブジェクトを返す必要があるので、助けになりません。ただし、DBに適切に保存されている場合に限ります。その分割は、1つのクエリから2つのクエリを作成するだけです。最初に無料のIDを取得し、DBに '刑務所 'を保存します。 –