何故staticの変数、メソッドにインスタンスを使ってアクセスしたらいけないのか
題名の通り、何故static
の変数にインスタンスを使ってアクセスをしたらいけないのでしょうか。
Javaでは、static
な変数に非static
にアクセスしようとすると警告が出ます。
class Instance{
public static final name="Static Field";
}
class Access{
public static void main(String[] args){
System.out.println(new Instance().name);
//警告(static-access)
}
}
このコードだと、インスタンスを無駄に生成している。ということで納得いきます。
ここも参考にしました。
staticなメンバーを修飾する必要がある場合はクラス名を使う。そのクラスの変数や式経由で使ってはならない。
ですが次のような時はどうでしょう。
public class Main{
public static void main(String[] args){
Class<?> cls = Class.forName(args[1]);
Instance instance=(Instance)cls.newInstance();
Load.load(instance);
}
}
class Load{
public static load(Instance instance){
//警告発生
System.out.print(instance.explanation);
}
}
abstract class Instance{
public static explanation;
}
このコードでは、Instanceを継承したクラスのstaticフィールドにアクセスするのが目的なのですが、Instance
を継承したクラスの名前は決まっているわけではないので
クラス名.フィールド名
でアクセスすることが出来ない(出来るとしても少し手間がかかる)と思います。
警告自体は
@SuppressWarning("static-access")
で抑えられるのですがどうしてなのかなと思って投稿しました。