題名の通り、何故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)
  }
}

このコードだと、インスタンスを無駄に生成している。ということで納得いきます。

ここも参考にしました。

Google Java Style:

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

で抑えられるのですがどうしてなのかなと思って投稿しました。