bubble: [gelöst] Java - Klassenstruktur - Readable - ReadWritable

Beitrag lesen

So, dass ich nur noch Grupperungsklassen*3 + 1 (der Readonly-Wrapper) Dateien habe.

Ich hab jetzt eine für mich akzeptable Lösung gefunden. Eher durch Zufall bin ich darauf gestoßen:

public class ReadOnly implements InvocationHandler {  
	public static Object get(Class<?> iface, Class<?> makeReadOnly, Object object) {  
		return Proxy.newProxyInstance(iface.getClassLoader(), new Class[]{iface}, new ReadOnly(object, makeReadOnly));  
	}  
	private final Class<?> makeReadOnly;  
	private final Object source;  
	  
	public ReadOnly(Object source, Class<?> makeReadOnly) {  
		this.source = source;  
		this.makeReadOnly = makeReadOnly;  
	}  
  
	@Override  
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {  
		String methodName = method.getName();  
		if(methodName.toLowerCase().startsWith("set")) {  
			throw new UnsupportedOperationException();  
		}  
		else {  
			Method sourceMethod = source.getClass().getMethod(methodName, method.getParameterTypes());  
			Object result = sourceMethod.invoke(source, args);  
			if(makeReadOnly.isAssignableFrom(result.getClass())) {  
				Class<?> rcl = sourceMethod.getReturnType();  
				result = ReadOnly.get(rcl, makeReadOnly, result);  
			}  
			return result;  
		}  
	}  
}

Das einzige was noch nicht wirklich passt, ich jetzt aber vernachlässige ist, dass man dann die set*-Funktionen trotzdem noch sieht:

  
public interface IConfig {}  
  
public interface IProjectConfig extends IConfig {  
	public String getOwner();  
	public void setOwner(String owner);  
	public IManagers getManagers();  
	public void setManagers(IManagers managers);  
}  
  
public interface IManagers extends IConfig {/* ... */}  
  
public class ProjectConfig implements IProjectConfig {  
	protected String owner;  
	protected IManagers managers;  
	public ProjectConfig() {/* ... */}  
	public ProjectConfig(String owner, IManagers managers) {/* ... */}  
	public String getOwner() {/* ... */}  
	public void setOwner(String owner) {/* ... */}  
	public IManagers getManagers() {/* ... */}  
	public void setManagers(IManagers managers) {/* ... */}  
}  
  
public class Managers implements IManagers {/* ... */}

Erzeugen kann ich das ganze dann ganz einfach mit:
IProjectConfig cfgRO = (IProjectConfig) ReadOnly.get(IProjectConfig.class, IConfig.class, new ProjectConfig());

Ob ich die set*-Funktionen noch irgendwie aus der IDE rausbekomme muss ich dann noch gucken.

MfG
bubble

--
If "god" had intended us to drink beer, he would have given us stomachs. - David Daye