Если я правильно вас понял, ваш код выглядит примерно так
public class Main {
private String field1;
private String field2;
public String getAttribute(String name) {
switch (name) {
case "field1":
return this.field1;
case "field2":
return this.field2;
case "notDeclaredField":
return this.notDeclaredField; // <- this is simply an error that the javac is telling you about
default:
throw new IllegalArgumentException("Invalid name");
}
}
}
, и проблема, с которой вы сталкиваетесь, заключается в том, что ваш код не может быть скомпилирован, поскольку вы ссылаетесь на поле, которое не объявлено. Это связано с тем, что Java - это язык, обеспечивающий применение этого поля, типа, методов и т. Д. c. должны быть определены (во время компиляции), прежде чем они будут использованы. Вы, похоже, пришли из языков, таких как python, где вы определяете поле экземпляра, используя его.
class Class:
def __init__(self):
pass
def setAtt(self, value):
self.field = value # this is okay in python
С другой стороны, приведенный ниже код прекрасно скомпилируется и будет выполнять то, что вам нужно ожидайте, что
public class Main {
private String field1;
private String field2;
public String getAttribute(String name) {
switch (name) {
case "field1":
return this.field1;
case "field2":
return this.field2;
default:
throw new IllegalArgumentException("Invalid name");
}
}
}
заметит, что нет доступа к полю, которое не объявлено. Но если у вас есть фиксированный набор атрибутов, к которым вы хотите иметь доступ, вы должны просто написать геттер для каждого из них. Таким образом, вы получаете гарантию того, что поле / атрибут присутствует во время компиляции, а не во время выполнения.
Но если вы хотите иметь возможность добавлять атрибуты к вашему экземпляру класса во время выполнения, вы должны использовать Map<,>
чтобы отслеживать их значения
import java.util.HashMap;
public class Main {
private HashMap<String, String> atts = new HashMap<>();
public String getAttribute(String name) {
if (atts.containsKey(name)) {
return atts.get(name);
} else {
throw new IllegalArgumentException("There is not attribute with the name: " + name);
}
}
public static void main(String[] args) {}
}