0

Java 1.4 の列挙型動作をエミュレートするクラスがあります。

public class PacketType {

    String Name ="9";

    public static final PacketType None = new PacketType("9");
    public static final PacketType StartOfOperation = new PacketType("1");

    PacketType (String Name ) {
        this.Name = Name;
    }

    public String toString() {
        return Name ;       
    }

    public static void main(String[] args) {
        PacketType p = PacketType.StartOfOperation;

        if (p == PacketType.StartOfOperation) {
            System.out.print("==");
        }

        if (p.equals(PacketType.StartOfOperation) ) {
            System.out.print("equals");
        }
    }
}

次に、どの値が variable を持つかを知る必要がありますp。両方とも、メイン関数でチェックを渡しますequals==しかし、アプリケーションに複数のスレッドがある場合、このチェックに合格しません。PacketType.StartOfOperationすべての変数に同じ静的変数を割り当てましたPacketTypeequalデバッガーは、私が同じ値を持っていることを示していますが、同じ変数ハンドラーは持っていません (そのため、 andが渡されません==)。同じハンドルを持つ必要があると思います。なぜそれはとても奇妙に振る舞うのですか?

4

1 に答える 1

0

使用する==と、両方の参照が同じオブジェクトを指している場合に true を返します。

if (p == PacketType.StartOfOperation)

ここでは、両方の参照が異なるオブジェクトを指しているため、実行されません。これを試して

 PacketType p =PacketType.None;
 PacketType p1 =PacketType.None;   

    if (p == p1)
    {
    System.out.print("=="); //prints ==
    }

None は静的であるため、すべての参照は同じオブジェクトを指し、==true を返します。

于 2013-08-14T09:38:13.547 に答える