PROPOSAL: Multiple switch expressions and case ranges (original) (raw)

Marek Kozieł develop4lasu at gmail.com
Thu Mar 5 22:40:33 PST 2009


Hi.

I hoped that no one will be interested in this solution (but I was wrong).

Extending switch is no problem for me, but why so partially? Let's see some switch construction that would allow to handle any object (inluding null-s) and keep encapsulation as well:

Base Interfaces:

public interface Equally { /**

public interface EquallyAsymmetric<Source,Target> { /**

int compare(Source source, Target target); }

Switch: switch ( Expression : Equally) SwitchBlock switch ( Expression : EquallyAsymmetric) SwitchBlock

switch ( Expression : Comparator) SwitchBlock switch ( Expression : ComparatorAsymmetric) SwitchBlock switch ( Expression : null) SwitchBlock // for natural order

How would that work? public class SomeData {

public SomeData(String key, Data data) { super(); this.key = key; this.data = data; // validation }

private Data data;

public final String key;

public final static Equally equally = new EquallySomeData();

public final static EquallyAsymmetric<SomeData, String> equallyAsymmetric = new EquallyAsymmetricSomeData(); ;

public final static Comparator comparator = new ComparatorSomeData();

private static class ComparatorSomeData implements Comparator { @Override public int compare(SomeData o1, SomeData o2) { return o1.key.compareTo(o2.key); }

};

private static class EquallyAsymmetricSomeData implements EquallyAsymmetric<SomeData, String> { @Override public boolean equal(SomeData source, String target) { return source.key.equals(target); } };

private static class EquallySomeData implements Equally { @Override public boolean equal(SomeData object, SomeData other) { return object.key.equals(other.key); } }

}

Equally sample: SomeData getMatch(String key) { switch (new SomeData(key,null):SomeData.equally) { case someData: break; default: break; } }

Equally asymmetric sample: SomeData getMatch(String key) { switch (new SomeData(key,null):SomeData.equallyAsymmetric ) { case „some”: break; default: break; } }

Comparator sample: SomeData getMatch(String key) { switch (new SomeData(key,null):SomeData.equallyAsymmetric ) { case lower <= ... < upper, special: break; default: break; } }

Notice that if you want ranges in case soon or later o will need relations: <=, >=, <, >, because there is no (""-1), I know there is workaround but as I think there is no need to put solution which require new workarounds.

WORKAROUND: enum Switch {

ONE("asd") { @Override public void action() { System.out.println(this.text); } },// TWO("bad");//

protected String text;

public void action() { throw new NotImplementedException(); }

Switch(String text) { if (text == null) { throw new NullPointerException("text"); } this.text = text; }

public static Switch getByText(String text) { if (text == null) return null; for (Switch casee : Switch.values()) { if (casee.text.equals(text)) return casee; } return null; }

public static Switch getByTextForStartWith(String prefix) { if (prefix == null) return null; for (Switch casee : Switch.values()) { if (casee.text.startsWith(prefix)) return casee; } return null; }

}

REFERENCES: http://bugs.sun.com/view_bug.do?bug_id=5012262

http://lasu2string.blogspot.com/2008/12/string-switch-small-language-changes-on.html

-- Pozdrowionka. / Regards. Lasu aka Marek Kozieł

http://lasu2string.blogspot.com/



More information about the coin-dev mailing list