В java может ли переменная экземпляра и метод иметь одно и то же имя без какой-либо нестабильности или конфликта?
Я хочу убедиться, что мне удастся скомпилировать его, чтобы он не вызывал ошибок в дороге.
В java может ли переменная экземпляра и метод иметь одно и то же имя без какой-либо нестабильности или конфликта?
Я хочу убедиться, что мне удастся скомпилировать его, чтобы он не вызывал ошибок в дороге.
Да, это хорошо, главным образом потому, что синтаксически они используются по-разному.
Это совершенно нормально, потому что методы и переменные называются по-разному.
Код:
String name = "myVariable";
public String name() {
return "myMethod";
}
System.out.println(name()); // Brackets for method call
System.out.println(name); // No brackets for variable call
Вывод:
MyMethod
MyVariable
Единственный конфликт, о котором я мог думать, -
int sameName = 5;
public int sameName() {
//method body
return 100;
}
Если вы пишете "this.sameName" , когда вы должны писать "this.sameName()" и наоборот в каком-то месте в программе, тогда аннигиляция кода только что начался.
На самом деле я столкнулся с проблемой, которая очень специфична. Он просто проявляется в Java 8 (с использованием Nashorn), но не в Java 6 (с использованием Rhino). Если он пытается получить доступ к переменной экземпляра объекта Java через Javascript, оператор []
возвращает экземпляр метода.
Предположим, что я запускаю следующее объявление Java:
class MyClass {
private boolean isSet=false;
public boolean isSet() { return isSet; }
}
Если я манипулирую объектом такого класса в Javascript, а затем попытаюсь получить к нему доступ с помощью оператора []
, я получаю ссылку на метод.
var obj = new MyClass();
var myfields = (myclass.getClass()).getDeclaredFields();
var myfieldname = myfields[0].name;
// The following prints the method declaration, not the boolean value:
// [jdk.internal.dynalink.beans.SimpleDynamicMethod boolean MyClass.isSet()]
println( obj[myfieldname] );
UPDATE: По-видимому Метод переноса Nashorn, перегружающий механизм разрешения ( "неявно" или ненаучно) дает более высокий приоритет методам без аргументов над полями экземпляра с одно и то же имя.
Вы можете, но это анти-шаблон, следует избегать, и его можно поймать аналитикой следующим образом: