1

Thinking in Javaでこのコードを読んで、戸惑いました。

    package generics;

    //: generics/Mixins.java
    import java.util.*;

    interface TimeStamped { long getStamp(); }

    class TimeStampedImp implements TimeStamped {
      private final long timeStamp;
      public TimeStampedImp() {
        timeStamp = new Date().getTime();
      }
      public long getStamp() { return timeStamp; }
    }

    interface SerialNumbered { long getSerialNumber(); }

    class SerialNumberedImp implements SerialNumbered {
      private static long counter = 1;
      private final long serialNumber = counter++;
      public long getSerialNumber() { return serialNumber; }
    }

    interface Basic {
      public void set(String val);
      public String get();
    }

    class BasicImp implements Basic {
      private String value;
      public void set(String val) { value = val; }
      public String get() { return value; }
    }

    class Mixin extends BasicImp
    implements TimeStamped, SerialNumbered {
      private TimeStamped timeStamp = new TimeStampedImp();
      private SerialNumbered serialNumber =
        new SerialNumberedImp();
      public long getStamp() { return timeStamp.getStamp(); }
      public long getSerialNumber() {
        return serialNumber.getSerialNumber();
      }
    }

    public class Mixins {
      public static void main(String[] args) {
        Mixin mixin1 = new Mixin(), mixin2 = new Mixin();
        mixin1.set("test string 1");
        mixin2.set("test string 2");
        System.out.println(mixin1.get() + " " +
          mixin1.getStamp() +  " " + mixin1.getSerialNumber());
        System.out.println(mixin2.get() + " " +
          mixin2.getStamp() +  " " + mixin2.getSerialNumber());
        while(true)System.out.println(new Date().getTime());
      }
    } /* Output: (Sample)
    test string 1 1132437151359 1
    test string 2 1132437151359 2
    *///:~

getStamp()から返される値が同じなのはなぜですか?(1132437151359 == 1132437151359)?2つのオブジェクトが作成され、それらは異なる時間に異なるプロパティを作成します。それでは、なぜですか?

4

3 に答える 3

1

シリアル番号に時間を使用することはお勧めできません。同じ時間を取得している理由は、おそらくコードの実行がかなり速く、最初のオブジェクトのインスタンス化と2番目のオブジェクトのインスタンス化の間に十分な時間が経過していないためです。タイムスタンプはミリ秒単位で返されるため、両方のオブジェクトのインスタンス化が互いに1ミリ秒以内であれば、違いはわかりません。

システムの負荷を増やすと、違いが見られる場合がThread.sleep(5)あります。または、を使用してプログラムを一時停止する場合もあります。どちらのアプローチもあまり良くありません。

一意のIDの時間を使用する代わりに、を使用しますUUID

于 2012-09-05T14:07:51.430 に答える
1

この式new Date().getTime()は遅い方法でSystem.currentTimeMillis()あり、最小解像度は1ミリ秒です(ただし、一部のOSでは16ミリ秒になる場合があります)。

つまり、メソッドの呼び出し間隔が1ミリ秒未満の場合、同じ結果が得られる可能性があります。

より良いオプションは、IDにAtomicLong.getAndIncrement()を使用することです。

于 2012-09-05T14:10:34.673 に答える
0

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

Mixin mixin1 = new Mixin();
Thread.sleep(10);
Mixin mixin2 = new Mixin();

これで、これら2つのオブジェクトを作成するプロセスで10ミリ秒の一時停止が発生しました。

あなたのクラスは単純で、あなたは速いコンピュータを持っているので、2つのインスタンス間の時間の距離は非常に小さいのでJavaはそれを見ることができません。

于 2012-09-05T14:09:54.877 に答える