정적 멤버 클래스에 올바르게 액세스하려면 어떻게 해야 합니까?

StackOverflow https://stackoverflow.com/questions/86607

  •  01-07-2019
  •  | 
  •  

문제

두 개의 클래스가 있고 한 클래스의 정적 인스턴스를 다른 클래스 안에 포함하고 첫 번째 클래스를 통해 두 번째 클래스의 정적 필드에 액세스하려고 합니다.

이는 동일한 이름을 가진 동일하지 않은 인스턴스를 가질 수 있도록 하기 위한 것입니다.

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);
도움이 되었습니까?

해결책

나는 당신이 아마도 이것에 대해 잘못된 방식으로 생각하고 있다는 다른 사람들의 의견에 동의합니다.그 방법을 사용하면 정적 멤버에만 액세스하는 경우 이 방법이 도움이 될 수 있습니다.

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

다른 팁

다음을 사용해야 합니다.

Foo.bar

그리고 다음은 아닙니다:

A.foo.bar

이것이 바로 경고의 의미입니다.

그 이유는 bar 의 회원이 아닙니다. 사례 ~의 Foo.꽤, bar 글로벌하고 수업에 Foo.컴파일러는 인스턴스의 멤버인 것처럼 가장하기보다는 전역적으로 참조하기를 원합니다.

정적 멤버에만 액세스해야 하는 한 이러한 두 정적 변수를 클래스에 넣는 것은 의미가 없습니다.컴파일러는 다음과 같은 클래스 이름 접두사를 통해 액세스할 것으로 예상합니다.

package1.Foo.bar
package2.Foo.bar

다음 위치에서 객체를 생성한 후:

public static package1.Foo foo;

정적 방식으로 액세스되지 않습니다.클래스 이름은 물론 전체 패키지 이름을 사용하여 클래스를 지정해야 합니다. 클래스는 다른 패키지에서 동일한 이름을 갖기 때문입니다.

Foo 인스턴스가 Foo의 정적 필드에 액세스할 수 있는 것은 사실이지만 "정적"이라는 단어를 생각해 보세요.적어도 이 경우에는 "정적으로 바인딩됨"을 의미합니다.A.foo는 Foo 유형이므로 "A.foo.bar"는 객체에 "bar"를 요청하지 않고 바로 클래스로 이동합니다.즉, 하위 클래스에 "bar"라는 정적 필드가 있고 foo가 해당 하위 클래스의 인스턴스인 경우에도 FooSubclass.bar가 아닌 Foo.bar를 가져옵니다.그러므로 클래스 이름으로 참조하는 것이 더 나은 생각입니다. 상속을 이용하려고 하면 자해를 당할 것이기 때문입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top