質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

IntelliJ IDEA

IntelliJ IDEA(インテリジェイ アイディア)は、JetBrains社が開発した、 JavaやScalaなどで利用される統合開発環境です。

Q&A

解決済

1回答

2123閲覧

Bukkit(Spigot)プラグイン開発での クラス分け(ファイル分け)方法

kazuz

総合スコア20

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

IntelliJ IDEA

IntelliJ IDEA(インテリジェイ アイディア)は、JetBrains社が開発した、 JavaやScalaなどで利用される統合開発環境です。

0グッド

0クリップ

投稿2021/06/11 08:00

前提・実現したいこと

JAVAの知識はほぼ皆無の初心者です。(Node-REDを少し使っていた程度)
Spigotのプラグインを作っているのですが、1つのファイルにダラダラ書くのではなく
複数のファイルに分割したいと思い挑戦しているのですが、全くやり方がわかりません。(特に戻り値周り)

RangeMining.java(今まで作成していたメインのファイル)

public final class RangeMining extends JavaPlugin implements Listener { mining_range = 0; @Override public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, String[] args){ // test コマンドの処理 if(cmd.getName().equalsIgnoreCase("rm")){ if(args[0].equalsIgnoreCase("normal")) { mining_range = 0; sender.sendMessage(ChatColor.GREEN + "通常の採掘範囲です"); getLogger().info("normal"); return true; } if(args[0].equalsIgnoreCase("small")) { mining_range = 1; sender.sendMessage(ChatColor.GREEN + "3*3範囲を採掘します"); getLogger().info("small"); return true; } if(args[0].equalsIgnoreCase("medium")) { mining_range = 2; sender.sendMessage(ChatColor.GREEN + "5*5範囲を採掘します"); getLogger().info("medium"); return true; } if(args[0].equalsIgnoreCase("large")) { mining_range = 9; sender.sendMessage(ChatColor.GREEN + "10*10範囲を採掘します"); getLogger().info("large"); return true; } } return false; } }

試したこと、cmmand.java(分割先ファイル)

とりあえず新しいjavaファイルを作成してメインからコピペ、「public boolean」→「public int」に変更
適当な場所で「int mining_range = 0;」を宣言してIF文の最後を「return mining_range;」に変更してみました。
この場合 戻り値としては「int型のmining_range」であっていますか?

package epi.rangemining; import org.bukkit.ChatColor; import org.bukkit.plugin.java.JavaPlugin; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; public class cmmand { public static int cmmand_check() { int mining_range = new onCommand(); } public int onCommand(CommandSender sender, Command cmd, String commandLabel, String[] args){ // test コマンドの処理 int mining_range = 0; if(cmd.getName().equalsIgnoreCase("rm")){ if(args[0].equalsIgnoreCase("normal")) { mining_range = 0; sender.sendMessage(ChatColor.GREEN + "通常の採掘範囲です"); return mining_range; } if(args[0].equalsIgnoreCase("small")) { mining_range = 1; sender.sendMessage(ChatColor.GREEN + "3*3範囲を採掘します"); return mining_range; } if(args[0].equalsIgnoreCase("medium")) { mining_range = 2; sender.sendMessage(ChatColor.GREEN + "5*5範囲を採掘します"); return mining_range; } if(args[0].equalsIgnoreCase("large")) { mining_range = 9; sender.sendMessage(ChatColor.GREEN + "10*10範囲を採掘します"); return mining_range; } } return mining_range; } }

####一番困っている事
上のコードがあっているとして、「return mining_range」の値をメインの「RangeMining.java」で受け取る方法。
手探りで作ってみたコード

mining_range = 0; @Override public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, String[] args){ // test コマンドの処理 mining_range = cmmand.cmmand_check(); return false; }

IDEで「'cmmand' のメソッド 'cmmand_check' を解決できません」
「'cmmand' のメソッド 'cmmand_check'を作成」となり
これをクリックするとcmmand.javaに新たに

public static int cmmand_check() { }

が作成されてしまいます。

補足情報(FW/ツールのバージョンなど)

ツール:IntelliJ IDEA Community Edition 2021.1.2
JAVA16(?)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

Intellij 側でメソッドが解決できず、新規に作成してしまう原因はわからないのですが、
ひとまず以下を修正してもらっても大丈夫でしょうか。
(コードの記述違いが原因でうまく解決できていないのではないかとおもっていまして。)

コード修正に必要な知識としては以下になるのかなと思っております。

  • Java は method 内で使う変数は、引数で明示して渡す必要があります

(ファイル内から検索するとかはしてないということを書いてます)

  • new 演算子は class のインスタンス化につかうため、method 呼び出しでは不要です、

method 名を呼び出せば、そのまま呼び出せます。

  • static method から呼び出す method は、同じく static method である必要があります。
  • method で指定した戻り値方と同じ型の値を return <値> で返す必要があります

(これは単に記述漏れかと思われますが)

そのため、変更する要素としては以下になると思われます

  • cmmand_check メソッドにも引数をつけ、それを中のメソッドにも渡す(onCommand と同じもの)
  • new onCommand() から onCommand(sender, cmd, commandLabel, args) に変更する

(onCommand を static 化したら、cmmand_check 自体不要で、RangeMining.onCommand から直接呼べばよくなるかもしれませんが)

  • cmmand_check メソッド は return mining_range する
  • onCommand メソッドに static 修飾子つける
  • cmmand.cmmand_check()cmmand.cmmand_check(sender, cmd, commandLabel, args) に変更する

Java の class 名が大文字にされていないとか、
arg 配列の長さチェックされてないので例外で落ちそうとか、
気になる点もあるのですが、ひとまず実行可能な状態にはなるかと思われます

この場合 戻り値としては「int型のmining_range」であっていますか?

この点については、正しく戻り値を扱えています。

投稿2021/06/12 10:37

kiino

総合スコア539

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kazuz

2021/06/16 20:07

cmmand.cmmand_check(sender, cmd, commandLabel, args) ↑の部分の記述の仕組みが今回理解でき動作も問題なく満足しています! ありがとうございます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問