4

2つのクラスがあり、一方のクラスの静的インスタンスをもう一方のクラスの中に含め、2番目のクラスから最初のクラスを介して静的フィールドにアクセスしたいと考えています。

これは、同じ名前の同一でないインスタンスを持つことができるようにするためです。

Class A 
{
    public static package1.Foo foo;
}

Class B 
{
    public static package2.Foo foo;
}


//package1
Foo 
{
    public final static int bar = 1;
}

// package2
Foo
{
    public final static int bar = 2;
}

// usage
assertEquals(A.foo.bar, 1);
assertEquals(B.foo.bar, 2);

これは機能しますが、「静的フィールドFoo.barは静的な方法でアクセスする必要があります」という警告が表示されます。誰かがこれがなぜであるかを説明し、「正しい」実装を提供できますか?

静的インスタンスに直接アクセスできることはわかっていますが、パッケージ階層が長い場合は、見苦しくなります。

assertEquals(net.FooCorp.divisions.A.package.Foo.bar, 1);
assertEquals(net.FooCorp.divisions.B.package.Foo.bar, 2);
4

5 に答える 5

10

次を使用する必要があります。

Foo.bar

そしてそうではありません:

A.foo.bar

それが警告の意味です。

その理由は、のインスタンスbarメンバーではないためです。むしろ、クラス上でグローバルです。コンパイラーは、インスタンスのメンバーであるかのように見せかけるのではなく、グローバルに参照することを望んでいます。FoobarFoo

于 2008-09-17T19:21:29.987 に答える
2

これら 2 つの静的変数をこれらのクラスに配置しても、静的メンバーにアクセスする必要があるだけであれば意味がありません。コンパイラは、次のようなクラス名プレフィックスを介してアクセスすることを想定しています。

package1.Foo.bar
package2.Foo.bar
于 2008-09-17T19:24:53.503 に答える
2

オブジェクトを次の場所に作成したら:

public static package1.Foo foo;

静的な方法でアクセスされていません。クラス名と、もちろん、完全なパッケージ名を使用してクラスを指定する必要があります。これらは異なるパッケージで同じ名前を持っているためです。

于 2008-09-17T19:27:12.360 に答える
1

私はあなたがおそらくこれを間違った方法で考えているという他の人たちに同意します。これが邪魔にならないので、静的メンバーにのみアクセスしている場合は、これでうまくいく可能性があります。

public class A {
    public static class Foo extends package1.Foo {}
}
public class B {
    public static class Foo extends package2.Foo {}
}
于 2008-09-17T22:06:55.003 に答える
0

Foo インスタンスが Foo の静的フィールドにアクセスできるのは事実ですが、「静的」という言葉について考えてみてください。少なくともこの場合は、「静的にバインドされている」ことを意味します。A.foo は Foo 型であるため、「A.foo.bar」はオブジェクトに「bar」を要求せず、直接クラスに移動します。つまり、サブクラスに「bar」という静的フィールドがあり、foo がそのサブクラスのインスタンスであっても、FooSubclass.bar ではなく Foo.bar が取得されます。したがって、クラス名で参照することをお勧めします。継承を利用しようとすると失敗するからです。

于 2008-09-17T19:27:31.983 に答える