0

Java を使用して単純なスプレッドシートを実装しようとしています。コンソールのいくつかのメニューを介してユーザーとやり取りし、ユーザーは、作成するスプレッドシートに関する事前に作成された情報 (行、列、およびセルの内容) を含む特定のファイルをインポートできます。私はパーサーと呼ばれる静的クラスを作成しようとしています。このクラスの目標は、インポートの各行を細かく分割して、正しいメソッドをそれらに適用できるようにすることです (コンテンツが表示されているセルを読み取ります)。追加しようとしているコンテンツの種類)。

必要なたびに新しいオブジェクトをインスタンス化する必要なく使用したいので、パーサーを静的にしました (これは正しいですか?)。ただし、問題を引き起こしている特定の方法があります。このような入力を受け取るたびに1;1|=2;3、セル 1;1 がセル 2;3 を参照していることを意味します。パーサーに新しい参照 (getCell(i,j)) を返すように指示しています。これは、Reference クラスのコンストラクターが Cell を受け取るためですが、もちろん Java コンパイラーは、非静的メソッド (getCell の場合) をその静的クラス内で使用できないことを通知します。

だから私の質問は: この問題を克服する方法はありますか? 静的クラスで非静的メソッドを使用する方法はありますか?それとも、インポート ファイルを読み取ろうとするときに新しい Parser オブジェクトをインスタンス化する必要がありますか?

4

4 に答える 4

2

どちらの方法がより適切かを判断するためにコードの一部を確認することは役立つかもしれませんが、これはオブジェクト指向設計の一般的な落とし穴であるため、一般的に質問に答えようとします。

何かを static として定義すると、クラス名を共有していても、どのインスタンスとも関連付けられないことを意味します。例えば、

public class Table {
  List<Cell> cells;

  public Table() {
    while (someCondition)
      parseInput(nextInput);
  }

  public Cell getCell(int i, int j) {
    ...
  }

  public static Cell parseInput(String input) {
    Cell cellToReturn = new Cell();
    ...
    if (input.references(cell)) cell = getCell(i,j); //Error here!
    ...
    return cellToReturn;
  }
}

parseInput メソッドが静的であるにもかかわらず、特定のインスタンスのセルのリストを参照しているため、問題が発生します。それはどちらを参照していますか?知るか!

この問題は、次の 2 つの方法で解決できます。

1: パーサーを非静的にします。public Cell parseInput(String input) {

2: テーブルをパーサーに渡して、何を参照すればよいかを認識します。

public static Cell parseInput(String input, Table target) {
  Cell cellToReturn = new Cell();
  ...
  if (input.references(cell)) cell = target.getCell(i,j); //No more error!
  ...
  return cellToReturn;
}

さて、あなたが述べたように、パーサーは単なるメソッドではなくクラスです。しかし、一般的な規則は依然として適用されます。静的メソッドはどのインスタンスにも関連付けられていないため、静的メソッドからインスタンス フィールドを参照することはできません。

于 2013-11-14T20:55:43.170 に答える