Могу ли я добавить новый дочерний класс во время выполнения? - PullRequest
0 голосов
/ 28 января 2020

Мне нужно добавить следующий класс во время выполнения:

public class MapperFunction extends Mapper<Integer, String, String, Integer> {


    public MapperFunction(InputBlock s) {
        super(s);
    }

    @Override
    protected void map(Integer key, String value) {
        Pattern pattern = Pattern.compile("[a-zA-Z]+");
        Matcher matcher;
        String str = value;
        if (!str.equals("")) {
            matcher = pattern.matcher(str);
            while (matcher.find()) {
                String word = matcher.group();
                if (!MapperOut.containsKey(word))
                    MapperOut.put(word, 1);
                else
                    MapperOut.put(word, (Integer) MapperOut.get(word) + 1);
            }
        }
    }
}

или добавить метод map () в класс во время выполнения. Я прочитал следующий вопрос о stackoverflow Расширение или добавление новых классов во время выполнения в Java, но я думаю, что мой случай немного отличается, в любом случае это родительский класс Mapper:

public abstract class Mapper<keyIn, valueIn, keyOut, valueOut>  implements Runnable {

    private RecordReader recordReader;
    static AtomicInteger numberOfThreadsPerMapper = new AtomicInteger(2);
    static Map<Object, Object> MapperOut = null;

    static {
        MapperOut = Collections.synchronizedMap(new TreeMap<>());
    }

    Mapper(InputBlock s) {
        recordReader = new LineRecordReader(s);
    }

    protected abstract void map(keyIn key, valueIn value) throws IOException, InterruptedException;

    @Override
    public void run() {
        run2();
    }

    public void run2() {
        try {
            while (recordReader.hasNext()) {
                map((keyIn) recordReader.getKey(), (valueIn) recordReader.getValue());
            }
            //   System.out.println("Thread out." + numberOfThreads.getAndIncrement());
        } catch (Exception e) {
            // e.printStackTrace();
        }
    }
}

Обратите внимание, что родительский класс Mapper расширяет Thread.

Мой второй вопрос: если я могу это сделать, как я могу создать экземпляр из него? Теперь мой призыв к созданию:

    @Override
    public void update(Observable o, Object arg) {

        executorService.submit(new MapperFunction((InputBlock) arg));
    }

Мой последний вопрос: если все, что может случиться, есть ли какой-либо недостаток (проблема производительности), поскольку приложение создает больше экземпляров из класса MapperFunction ()?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...