Morse code converter
MC_1(".----", '1'),
...


This is pretty repetitive. Unfortunately, you can't call the object simply 1, but you can do better:

MC_1(".----"),
...
Morse(String morse) {
    this.morse = morse;
    this.code = name().charAt(name().length - 1);
}


This assumes, you can use all needed chars as a part of the name, which is not the case. So let's handle it by adding another constructor (your original and using

MC_SPACE("/", ' ');


just like you did. But I'm not sure at all, if using an enum is the way to go. What about using a simple Map&lt;String, char&gt; and another the other way round or better a BiMap?

Encapsulate it in a class Codec and let the class do more work.



public static String morseConversion(String s) {
    String ms = s.toUpperCase().trim(); // modified string


As this is nothing but a cleanup of s, I'd simply modify it. There's a rule about never modifying arguments, but it's wrong. Ask yourself:


What harm can happen by cleaning up s directly?
What harm can happen by having both s and sm?


The answers should make it perfectly clear in this case.



for (int i = 0; i &lt; ms.length(); i++) {
    isValid(ms.charAt(i));


According to the name, isValid is a predicate. It returns a boolean to be used elsewhere. Your method should be called checkIsValid or alike. Or make it to a predicate and use checkArgument.



Validation is fine, but not here. What you do is determining if the following loop will succeed. So you're doing all the work twice.



for (Morse c : Morse.values()) {
     if (ms.charAt(i) == ' ' &amp;&amp; ms.charAt(i - 1) == ' ');


This test is independent of c, so it does not belong to the loop.

What's worse: if (..); else if is a really terrible way if writing conditions. It's pretty confusing. If you need something like this, write

     if (ms.charAt(i) == ' ' &amp;&amp; ms.charAt(i - 1) == ' ') {
         // Do nothing. Ignoring consecutive spaces.
     } else if (ms.charAt(i) == c.code) {





  It seems to me that I'm potentially looping quite a while, and this may not be the best or even common practice.


That's exactly what a Map is for. Feed it with the char. and it gives you the String. No loop needed.