По поводу "switch (data.length)": тут нужно задействовать полиморфизм. Создать интерфейс с методом который принимает массив int[]data, и под каждый вариант case сделать соответствующую реализацию.
Например
interface Worker {
void doWork(int[] data);
}
class Worker96 implements Worker {
public void doWork(int[] data) {
....
}
}
class Worker71 implements Worker {
public void doWork(int[] data) {
....
}
}
// потом можно создать мапу
class Main {
private Map<Integer, Worker> workers = ....;
Main (){
workers.put(96, new Worker96());
workers.put(71, new Worker71());
}
public void dataProcessing(int[] data) {
Worker w = workers.get(data.length);
if (w == null)
throw new RuntimeException("Unsupported data length!");
w.doWork(data);
}
}
// как то так...
По поводу первого случая, если код не предполагает хранение состояния,
то можно вынести код в отдельный утильный класса в статический метод.