/* package whatever; // don't place package name! */
import java.util.Objects;
import java.util.logging.Level;
import java.util.logging.Logger;
/* Name of the class has to be "Main" only if the class is public. */
class Ideone {
public static void main
(String[] args
) { ValueSwitcher<Integer> valueSwitcher = ValueSwitcher.getInstance();
valueSwitcher.setValue1(1);
valueSwitcher.setValue2(2);
valueSwitcher.switchValues();
System.
out.
println(String.
format("value1: %s, value2: %s", valueSwitcher.
getValue1(), valueSwitcher.
getValue2())); }
}
class ValueSwitcher<T1> {
private final static Logger LOGGER = Logger.getLogger("Value switcher");
private T1 value1;
private T1 value2;
public static <T> ValueSwitcher<T> getInstance() {
return new ValueSwitcher<>();
}
protected ValueSwitcher() {
LOGGER.entering(ValueSwitcher.class.getCanonicalName(), "ctor");
LOGGER.entering(ValueSwitcher.class.getCanonicalName(), "ctor");
}
public T1 getValue1() {
LOGGER.entering(ValueSwitcher.class.getCanonicalName(), "getValue1");
return value1;
}
public void setValue1(T1 value1) {
LOGGER.entering(ValueSwitcher.class.getCanonicalName(), "setValue1", value1);
this.value1 = value1;
LOGGER.exiting(ValueSwitcher.class.getCanonicalName(), "setValue1", value1);
}
public T1 getValue2() {
LOGGER.entering(ValueSwitcher.class.getCanonicalName(), "getValue2");
return value2;
}
public void setValue2(T1 value2) {
LOGGER.entering(ValueSwitcher.class.getCanonicalName(), "setValue2", value2);
this.value2 = value2;
LOGGER.exiting(ValueSwitcher.class.getCanonicalName(), "setValue2", value2);
}
@Override
public boolean equals
(Object o
) { if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
ValueSwitcher<?> that = (ValueSwitcher<?>) o;
return Objects.equals(getValue1(), that.getValue1()) &&
Objects.equals(getValue2(), that.getValue2());
}
@Override
public int hashCode() {
return Objects.hash(getValue1(), getValue2());
}
public void switchValues() {
LOGGER.entering(ValueSwitcher.class.getCanonicalName(), "switchValues");
T1 tmpValue = getValue1();
setValue1(getValue2());
setValue2(tmpValue);
if (shouldLogInfo()) {
LOGGER.
log(Level.
INFO,
String.
format("Values %s and %s has been switched", value1, value2
)); }
LOGGER.exiting(ValueSwitcher.class.getCanonicalName(), "switchValues");
}
private static boolean shouldLogInfo() {
Level level = Logger.getGlobal().getLevel();
return level != null && level.intValue() > Level.INFO.intValue();
}
}
LyogcGFja2FnZSB3aGF0ZXZlcjsgLy8gZG9uJ3QgcGxhY2UgcGFja2FnZSBuYW1lISAqLwoKaW1wb3J0IGphdmEudXRpbC5PYmplY3RzOwppbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CmltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CgovKiBOYW1lIG9mIHRoZSBjbGFzcyBoYXMgdG8gYmUgIk1haW4iIG9ubHkgaWYgdGhlIGNsYXNzIGlzIHB1YmxpYy4gKi8KY2xhc3MgSWRlb25lIHsKICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKICAgICAgICBWYWx1ZVN3aXRjaGVyPEludGVnZXI+IHZhbHVlU3dpdGNoZXIgPSBWYWx1ZVN3aXRjaGVyLmdldEluc3RhbmNlKCk7CiAgICAgICAgdmFsdWVTd2l0Y2hlci5zZXRWYWx1ZTEoMSk7CiAgICAgICAgdmFsdWVTd2l0Y2hlci5zZXRWYWx1ZTIoMik7CiAgICAgICAgdmFsdWVTd2l0Y2hlci5zd2l0Y2hWYWx1ZXMoKTsKICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oU3RyaW5nLmZvcm1hdCgidmFsdWUxOiAlcywgdmFsdWUyOiAlcyIsIHZhbHVlU3dpdGNoZXIuZ2V0VmFsdWUxKCksIHZhbHVlU3dpdGNoZXIuZ2V0VmFsdWUyKCkpKTsKICAgIH0KfQoKCmNsYXNzIFZhbHVlU3dpdGNoZXI8VDE+IHsKICAgIHByaXZhdGUgZmluYWwgc3RhdGljIExvZ2dlciBMT0dHRVIgPSBMb2dnZXIuZ2V0TG9nZ2VyKCJWYWx1ZSBzd2l0Y2hlciIpOwogICAgcHJpdmF0ZSBUMSB2YWx1ZTE7CiAgICBwcml2YXRlIFQxIHZhbHVlMjsKCgogICAgcHVibGljIHN0YXRpYyA8VD4gVmFsdWVTd2l0Y2hlcjxUPiBnZXRJbnN0YW5jZSgpIHsKICAgICAgICByZXR1cm4gbmV3IFZhbHVlU3dpdGNoZXI8PigpOwogICAgfQoKICAgIHByb3RlY3RlZCBWYWx1ZVN3aXRjaGVyKCkgewogICAgICAgIExPR0dFUi5lbnRlcmluZyhWYWx1ZVN3aXRjaGVyLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSwgImN0b3IiKTsKICAgICAgICBMT0dHRVIuZW50ZXJpbmcoVmFsdWVTd2l0Y2hlci5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCksICJjdG9yIik7CiAgICB9CgogICAgcHVibGljIFQxIGdldFZhbHVlMSgpIHsKICAgICAgICBMT0dHRVIuZW50ZXJpbmcoVmFsdWVTd2l0Y2hlci5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCksICJnZXRWYWx1ZTEiKTsKICAgICAgICByZXR1cm4gdmFsdWUxOwogICAgfQoKICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlMShUMSB2YWx1ZTEpIHsKICAgICAgICBMT0dHRVIuZW50ZXJpbmcoVmFsdWVTd2l0Y2hlci5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCksICJzZXRWYWx1ZTEiLCB2YWx1ZTEpOwogICAgICAgIHRoaXMudmFsdWUxID0gdmFsdWUxOwogICAgICAgIExPR0dFUi5leGl0aW5nKFZhbHVlU3dpdGNoZXIuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpLCAic2V0VmFsdWUxIiwgdmFsdWUxKTsKICAgIH0KCiAgICBwdWJsaWMgVDEgZ2V0VmFsdWUyKCkgewogICAgICAgIExPR0dFUi5lbnRlcmluZyhWYWx1ZVN3aXRjaGVyLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSwgImdldFZhbHVlMiIpOwogICAgICAgIHJldHVybiB2YWx1ZTI7CiAgICB9CgogICAgcHVibGljIHZvaWQgc2V0VmFsdWUyKFQxIHZhbHVlMikgewogICAgICAgIExPR0dFUi5lbnRlcmluZyhWYWx1ZVN3aXRjaGVyLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSwgInNldFZhbHVlMiIsIHZhbHVlMik7CiAgICAgICAgdGhpcy52YWx1ZTIgPSB2YWx1ZTI7CiAgICAgICAgTE9HR0VSLmV4aXRpbmcoVmFsdWVTd2l0Y2hlci5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCksICJzZXRWYWx1ZTIiLCB2YWx1ZTIpOwogICAgfQoKICAgIEBPdmVycmlkZQogICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7CiAgICAgICAgaWYgKHRoaXMgPT0gbykgcmV0dXJuIHRydWU7CiAgICAgICAgaWYgKG8gPT0gbnVsbCB8fCBnZXRDbGFzcygpICE9IG8uZ2V0Q2xhc3MoKSkgcmV0dXJuIGZhbHNlOwogICAgICAgIFZhbHVlU3dpdGNoZXI8Pz4gdGhhdCA9IChWYWx1ZVN3aXRjaGVyPD8+KSBvOwogICAgICAgIHJldHVybiBPYmplY3RzLmVxdWFscyhnZXRWYWx1ZTEoKSwgdGhhdC5nZXRWYWx1ZTEoKSkgJiYKICAgICAgICAgICAgICAgIE9iamVjdHMuZXF1YWxzKGdldFZhbHVlMigpLCB0aGF0LmdldFZhbHVlMigpKTsKICAgIH0KCiAgICBAT3ZlcnJpZGUKICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CiAgICAgICAgcmV0dXJuIE9iamVjdHMuaGFzaChnZXRWYWx1ZTEoKSwgZ2V0VmFsdWUyKCkpOwogICAgfQoKICAgIHB1YmxpYyB2b2lkIHN3aXRjaFZhbHVlcygpIHsKICAgICAgICBMT0dHRVIuZW50ZXJpbmcoVmFsdWVTd2l0Y2hlci5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCksICJzd2l0Y2hWYWx1ZXMiKTsKICAgICAgICBUMSB0bXBWYWx1ZSA9IGdldFZhbHVlMSgpOwogICAgICAgIHNldFZhbHVlMShnZXRWYWx1ZTIoKSk7CiAgICAgICAgc2V0VmFsdWUyKHRtcFZhbHVlKTsKICAgICAgICBpZiAoc2hvdWxkTG9nSW5mbygpKSB7CiAgICAgICAgICAgIExPR0dFUi5sb2coTGV2ZWwuSU5GTywgU3RyaW5nLmZvcm1hdCgiVmFsdWVzICVzIGFuZCAlcyBoYXMgYmVlbiBzd2l0Y2hlZCIsIHZhbHVlMSwgdmFsdWUyKSk7CiAgICAgICAgfQogICAgICAgIExPR0dFUi5leGl0aW5nKFZhbHVlU3dpdGNoZXIuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpLCAic3dpdGNoVmFsdWVzIik7CiAgICB9CgogICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBzaG91bGRMb2dJbmZvKCkgewogICAgICAgIExldmVsIGxldmVsID0gTG9nZ2VyLmdldEdsb2JhbCgpLmdldExldmVsKCk7CiAgICAgICAgcmV0dXJuIGxldmVsICE9IG51bGwgJiYgbGV2ZWwuaW50VmFsdWUoKSA+IExldmVsLklORk8uaW50VmFsdWUoKTsKICAgIH0KCn0=