Frage

Ich habe zwei Klassen, und will in der anderen und Zugriff auf die statischen Felder aus der zweiten Klasse über die ersten eine statische Instanz einer Klasse gehört.

Das ist so, kann ich nicht identische Instanzen mit dem gleichen Namen.

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);

Das funktioniert, aber ich erhalte eine Warnung „Das statische Feld Foo.bar shoudl in einer statischen Art und Weise zugegriffen werden“. Kann jemand erklären, warum dies eine „richtige“ Implementierung und bietet.

Ich weiß, ich könnte die statischen Instanzen direkt zugreifen, aber wenn Sie eine lange Pakethierarchie haben, das wird hässlich:

assertEquals(net.FooCorp.divisions.A.package.Foo.bar, 1);
assertEquals(net.FooCorp.divisions.B.package.Foo.bar, 2);
War es hilfreich?

Lösung

ich mit anderen einverstanden, dass Sie wahrscheinlich über das den falschen Weg zu denken. Mit diesem aus dem Weg, kann dies für Sie arbeiten, wenn Sie nur den Zugriff auf statische Elemente:

public class A {
    public static class Foo extends package1.Foo {}
}
public class B {
    public static class Foo extends package2.Foo {}
}

Andere Tipps

Sie sollten verwenden:

Foo.bar

Und nicht:

A.foo.bar

Das ist, was die Warnung bedeutet.

Der Grund dafür ist, dass bar ist kein Mitglied einer Instanz von Foo. Vielmehr ist bar global, auf die Klasse Foo. Der Compiler will man es global eher verweisen, als es ist ein Mitglied der Instanz so zu tun.

Es gibt keinen Sinn, diese beiden statischen Variablen in diese Klassen bei der Umsetzung, solange Sie nur statische Member zugreifen müssen. Der Compiler erwartet Sie sie Trog Klasse Namenspräfixe wie zuzugreifen:

package1.Foo.bar
package2.Foo.bar

Sobald Sie erstellt das Objekt in:

public static package1.Foo foo;

es ist nicht in einer statischen Art und Weise zugegriffen wird. Sie werden die Klassennamen verwenden und, natürlich, die vollständigen Paketnamen, die Klasse zu behandeln, da sie den gleichen Namen auf verschiedene Paketen

Es ist wahr, dass eine Foo-Instanz Zugriff auf Foo statische Felder hat, aber denken Sie über das Wort „statisch“. Es bedeutet „statisch gebunden“, zumindest in diesem Fall. Da A.foo vom Typ Foo ist „A.foo.bar“ ist nicht das Objekt, für „bar“ gehen zu fragen, es geht direkt in die Klasse zu gehen. Das bedeutet, dass selbst wenn eine Unterklasse ein statisches Feld hat „bar“ genannt, und foo ist eine Instanz dieser Unterklasse, es wird Foo.bar, nicht FooSubclass.bar zu bekommen. Daher ist es eine bessere Idee, es mit dem Klassennamen zu verweisen, da, wenn Sie versuchen, den Vorteil der Vererbung nehmen Sie selbst in den Fuß schießen werden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top