2016-11-15 14 views
0

私はstaticListを持っていますが、これはjobsListというコードのどこかで使用されています。私はそれに静的メソッドを使用して要素を追加したいと思います。なんらかの理由で、私は要素を追加するたびに、最初の要素は今追加した要素であり、それ以外は何もないようにjobListを上書きしています。のように、他の要素はこれまで追加されていません。以下の関連するコードは:最初の要素を上書きする静的なArrayListに追加

public static ArrayList<Job> jobList = null; 

public JobSchedule() { 
    jobList = new ArrayList<Job>(10); 

} 

public static Job addJob(int time) { 
    System.out.println("Adding job " + time); 
    Job j = new Job(time); 

    jobList.add(j); 
    System.out.println("Current joblist size: " + jobList.size()); 
    System.out.println("First element: " + jobList.get(0).weight); 
    return j; 
} 

プリントラインからの出力は次のようになります。

Adding job 8 
Current joblist size: 1 
First element: 8 
Adding job 5 
Current joblist size: 1 
First element: 5 
理想的

私はそれがサイズをインクリメントし、正しいインデックスで仕事を置くべき追加するたびに、私はよなぜarraylistが上書きされているのか分かりません。

+0

答えは静的なのでです。すべての静的を削除し、それは動作します – XtremeBaumer

+0

'static ArrayList jobList' ....' public JobSchedule(){jobList = new ArrayList (10); } '、何かここにはないように見えます。 – SomeJavaGuy

+0

メソッドまたはarrayListを意味しますか?私は静的にするためにarrayListを必要とし、メソッド宣言から静的を削除するときにも同じ問題が発生します。 – Drivebyluna

答えて

3

私はこれが新しいのArrayListにあなたがそれを呼び出すたびに作成

JobSchedule(){ 
    jobList = new ArrayList<Job>(10); 
} 

、あなたは毎回コンストラクタを呼び出していると思います。

コンストラクタは不要です。このような何かを:

public static ArrayList<Job> jobList = null; 

public static Job addJob(int time) { 

    if (jobList == null) { 
     jobList = new ArrayList<Job>(10); 
    } 
    System.out.println("Adding job " + time); 
    Job j = new Job(time); 

    jobList.add(j); 
    System.out.println("Current joblist size: " + jobList.size()); 
    System.out.println("First element: " + jobList.get(0).weight); 
    return j; 
} 
+0

私はaddJob本体からコンストラクタを呼び出していません。また、(グラフのような)ジョブスケジュールを実際に作成するにはコンストラクタが必要です。ソートのようなスケジュールクラスから他の作業を行うこともできます。 – Drivebyluna

+0

コンストラクタで何もする必要はありません。他のものとは別に、ここのコードはスレッドセーフではありません。宣言されたときにリストを割り当てます。 –

+0

コンストラクタを呼び出すときに毎回リストを初期化していて、コンストラクタをコールしていない場合*あなたは 'null'リストに値を入れています*これはもっと悪いです – emotionlessbananas

0

最も可能性が高い理由はaddJob(5)を呼び出す前に、あなたは静的リストをオーバーライドしているコンストラクタJobSchedule()を呼んでいるということです。期待通りにインスタンスメソッドで

public static ArrayList<Job> jobList = new ArrayList<Job>(10); 

public JobSchedule() { 
} 

とコードを静的変数の初期化を避けるため、これに対処するために

は動作するはずです。あるいは、jobListフィールドとaddJobメソッドの両方を非静的にしてください。また、あなたはあなたのコンストラクタnew JobSchedule()を呼び出したときに、あなたの現在のコードでは

1

addJobを呼び出す前に、コンストラクタを毎回呼び出さない必要があるだろう、ブランドの新しいArrayListオブジェクトが作成され、同じ参照に代入されます。

Infactは、私は以下に示すようにprivatestaticfinalであなたのjobList参照変数をマークするために、あなたをお勧めします:

private static final ArrayList<Job> jobList = new ArrayList<Job>(10); 
public JobSchedule() { 
} 
public static Job addJob(int time) { 
    System.out.println("Adding job " + time); 
    Job j = new Job(time); 

    jobList.add(j); 
    System.out.println("Current joblist size: " + jobList.size()); 
    System.out.println("First element: " + jobList.get(0).weight); 
    return j; 
} 

private - 同じクラス

static内でアクセスすることができます - 維持しましたクラス全体の単一コピー

final - 参照を再割り当てすることはできません(また、inheriできません新しいarraylist

テッドは)あなたの全体jobList (arraylist)publicとして変数を公開し、むしろ、いくつかのgetJob(T t)方法を(私はprivateとしてそれをマークしている理由である)を使用して、特定のJobを取得しようとすることは推奨されません。

0

ありがとうございます。私はコードを書き直して空のコンストラクタを作成し、サブクラスを通常のネストされたクラスにして、ネストされたクラスオブジェクトのスーパークラスのインスタンスを渡してからsort()を呼び出すことができました。

public JobSchedule() {} 

public Job addJob(int time) { 
    Job j = new Job(time, this); 
    jobList.add(j); 
    return j; 
} 

Nested class...{ 
public JobSchedule schedule = null; 

    private Job(int time, JobSchedule schedule) 
    { 
     this.schedule = schedule; 
     this.weight = time; 
    } 

    public int getStartTime() { 
     schedule.kahnSort(); 
     . 
     . 
     . 
} 
0

新しいJobScheduleオブジェクトの前に常に要素を追加すると思います。コンストラクタで静的なArrayListをインスタンス化しないでください

関連する問題