0

クラスパスからメソッドパスを呼び出したい。いくつかの数値を設定する必要があります-配列の長さと入り口での配列の適切な値。これは私のクラスです:

class Path {
 int number;
 String[] path_name = new String [number];
 Path (int n, String [] p){
     number=n; 
     path_name=p; 
 }
public void path(){
 for (int i=1; i<number; i++){
     driver.findElement(By.linkText(path_name[i])).click();  
 }
}

}

これは私がメソッドを呼び出す方法です:

Path pa = new Path (6,'array value');
  pa.path();

しかし、「配列値」を適切に開始する方法がわかりません。たとえば、「1」、「2」、「3」を設定する必要があります。誰か助けてくれませんか?

最初は配列の長さが分からないので、コンストラクタで複数の文字列を定義することはできません

4

5 に答える 5

2

あなたのクラスには複数の問題があります。

クラス変数に直接書き込まれる変数の初期化の最初は、コンストラクタ本体が実行される前に行われます。したがって、path_name配列の初期化は常に のデフォルト値で行われ、numberそれは0です。これは機能しますが、この方法では配列に値を格納できません。

path_name今、あなたの体では、配列の内容で配列を埋めようとしていると思いますp。ただし、代わりにインスタンスを置き換えます。これは問題なく機能しますが、誰かがクラス外で配列を変更すると、このクラスでも変更されます。System.arraycopyまたはを使用して値を転送したいと思いますArrays.copyOf

コンストラクターを呼び出すには、次のように呼び出す必要があります。

new Path(6, new String[] {"one", "two", ...});

を使用して配列自体のサイズをいつでも参照できるため、改善として、number変数を完全に削除することをお勧めしますpath_name.length

あなたが調べたいと思うかもしれないもう一つのことは、可変長の引数です。コンストラクタを次のように変更すると、次のようになります。

Path(int n, String p...){
     number=n; 
     path_name = p
}

コンストラクターの呼び出しで、数字の後に追加される未定義の量の文字列があることを設定します。この文字列はすべて、 という文字列配列に自動的にパックされpます。この配列はこのコンストラクター内にのみ存在するため、変数の代わりにインスタンスを安全にコピーできます。コンストラクターの呼び出しは次のようになります。

new Path(6, "one", "two", ...);
于 2012-07-18T14:42:31.970 に答える
1

次のようなものを試してください:

Path pa = new Path(6, String[] {"one", "two", "three"} );

コードを変更できる場合は、おそらく可変引数を使用して簡単にすることができます。

Path (int n, String p...) 

次に、次のことができます。

Path pa = new Path(6, "one", "two", "three");
于 2012-07-18T14:33:15.183 に答える
0

あなたが何を求めているのか理解できれば、これがあなたの望むものだと思います -

class Path { 
 int number; 
 String[] path_name; 
 Path (int length){ 
     path_name = new String[length];
     for(int i=1;i<=length;i++)
         path_name[i-1] = Integer.ToString(i); 
 } 
} 

これは、配列を 1...n にすることを前提としています。必要な文字列要素が必要な場合は、これがおそらくより良い解決策だと思います。

 class Path { 
 int number; 
 String[] path_name; 
 Path (String p){ 
     path_name = p;
 }


 public void some_method(){ 
    String[] a = {"one", "two", "three"};
    Path p = new Path(a);
 }
 } 
于 2012-07-18T14:36:59.950 に答える
0

次のように、パスのインスタンス化の前に文字列配列を初期化できます。

String[] p = {"one", "two", "three"};
Path pa = new Path(6, p);
于 2012-07-18T14:37:03.077 に答える
0

配列のすべての要素がパスの有効な要素であるという不変条件を受け入れる場合、参照する n 番号を削除できます。

これを念頭に置いて、あなたは単に持つことができます

class Path {
    final String[] pathNames;
    // uses var args
    Path(String... paths) {
         pathNames = paths;
    }
    void path() {
        // uses enhanced for loop
        for(String path : pathNames) {
            driver.findElement(By.linkText(path)).click();
        }
    }
}

いくつかの批評:

  • number現在、オブジェクトを作成するときにサイズの配列を作成しています。しかし、その時点で数値は 0 です。したがって、空の配列を作成しています。
  • ただし、参照をすぐに再割り当てしているため、上記の点は関係ありません...
  • 防御的に配列をコピーしていないため、一部の外部コードが配列の要素を変更する可能性があります。これはおそらく良いことではありません。(これは、外部のコードがその配列にアクセスできない var args によって対処されます。誰かが var args の代わりに配列を渡すのを止めることはできませんが、少なくとも var args が期待されているという事実に気付くでしょう。 、したがって、必要に応じて内部的に変更する機能はまだありますが、そのような方法で誤ってバグを導入することはほとんどありません.)
于 2012-07-18T14:38:50.403 に答える