Incident Report 9079511: Java Language Enhancement: Disallow access to static members via object references

Tagir Valeev amaembo at gmail.com
Fri Jan 23 12:56:42 UTC 2026


Hello!

By the way, this "feature" complicates the static analysis, so I'd like if
we get rid of it. There's even a bug in IntelliJ IDEA, which I don't want
to fix. Try the following class:

class Test {
  static void test() {
    System.out.println("Static");
  }

  static void process(Test test) {
    test.test();
  }

  public static void main(String[] args) {
    process(null);
  }
}

There's a false-positive warning at `process(null)`: Passing 'null'
argument to parameter annotated as @NotNull, despite the code runs
perfectly. IntelliJ IDEA assumes that if you dereference the `test`
variable via `test.test()` call, then `test` must not be null, so passing
`null` to the `process` method should be disallowed. At this stage of
analysis, we cannot spend time on resolving the `test()` call and checking
whether it's static or not, so we just assume that nobody in their sane
mind calls static methods on instance qualifiers.

By the way, there's a warning already. It's just turned off by default.

C:\Temp>javac.exe -Xlint:static Test.java
Test.java:7: warning: [static] static method should be qualified by type
name, Test, instead of by an expression
    test.test();
        ^
1 warning

With best regards,
Tagir Valeev.

On Fri, Jan 23, 2026 at 1:43 PM Amazing Code <amazingcodewithus at gmail.com>
wrote:

> I am writing to propose a language enhancement regarding the handling of
> static member access in Java.
> *Issue*
>
> Java currently permits static fields and methods to be accessed through
> object references, despite static members belonging strictly to the class.
> This behavior is often misleading and can create confusion, especially in
> large codebases or among less-experienced developers.
>
> Example:
>
> MyClass obj = new MyClass();
> obj.staticMethod();   // Currently allowed, but confusing
>
> *Proposed Enhancement*
>
> I request consideration of a change that *disallows access to static
> members via object references*, enforcing access exclusively through the
> class name. This would convert the current warning into a *compile-time
> error*.
> *Rationale*
>
>    -
>
>    Prevents misconceptions about instance vs. class-level behavior
>    -
>
>    Improves code clarity and consistency
>    -
>
>    Reduces maintenance complexity in enterprise applications
>    -
>
>    Encourages best practices already recommended by the community
>
> *Suggested Requirements*
>
>    1.
>
>    Compiler should produce an error when static members are accessed
>    through object references.
>    2.
>
>    Error messages should explicitly guide developers to use class-based
>    access.
>    3.
>
>    Rules should apply to static fields, static methods, and static nested
>    types.
>    4.
>
>    Optionally, provide a compiler flag for backward compatibility during
>    migration.
>
> *Conclusion*
>
> Restricting object-based access to static members would strengthen
> language clarity and help eliminate a common source of misunderstanding. I
> kindly request your consideration of this enhancement for future Java
> releases.
>
> Thank you for your time and continued work on the Java platform.
>
> Sincerely,
> *Kamlesh Kohli*
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mail.openjdk.org/pipermail/amber-dev/attachments/20260123/c768e00e/attachment-0001.htm>


More information about the amber-dev mailing list