Собственные методы Java. Публичный и частный

Предположим, что нам нужно реализовать некоторый java-метод в собственном коде и выставить его пользователю. Мы знаем, что вся работа выполняется на родной стороне, т.е. Единственная ответственность java-кода - передать предоставленные пользователем аргументы в собственный код и вернуть результат обратно. В соответствии с этим, java-слой может быть реализован двумя способами:

  • Используя собственные методы, непосредственно связанные с пользователем:

    public native Object doSmth(Object arg0, Object arg1);
    
  • Используя тонкую публичную оболочку вокруг собственного собственного метода:

    public Object doSmth(Object arg0, Object arg1) {
        return nativeDoSmth(arg0, arg1);
    }
    
    private native Object nativeDoSmth(Object arg0, Object arg1);
    

Я видел оба подхода в реальных проектах и ​​даже в первых и последних в том же проекте.

Итак, мой вопрос: имеет ли какая-либо из упомянутых альтернатив какие-то технические или эксплуатационные или ремонтные преимущества, которые должны поощрять использование только одного варианта. Или, может быть, это всего лишь вопрос вкуса?

Ответ 1

Итак, мой вопрос: есть ли какие-либо из упомянутых альтернатив? технических или эксплуатационных характеристик, а также рекомендуется использовать только один вариант.

Преимущество в области безопасности - вот ключ. Как указано в комментариях, объект раскрывает свое поведение. Как это реализовано, это не пользовательский бизнес. Это дает вам большую гибкость.

Предположим, что в будущем (см.: ремонтопригодность) вы обнаружите, что вам нужно/нужно настроить метод таким образом, чтобы он делал что-то до и/или после обычного вызова. В первом подходе вам нужно будет отказаться от метода и создать новый. Во втором втором подходе вы просто добавляете все, что вам нужно в методе, и пользователю все равно.

Что касается производительности, теоретически, первый подход быстрее, потому что это менее 1 вызов. На практике это совершенно ничтожно.

Ответ 2

Я думаю, что это в основном личный стиль. Если вы считаете следующий код:

rattias-macbookpro: tst rattias $diff Test1.cl Test1.class rattias-macbookpro: tst rattias $vi Test1.java

public class Test1 {
  public static void main(String[] args) {
    Test2 t = new Test2();
    t.m();
  }
}

public class Test2 {
  public native void m();
}

При компиляции это дает Test1.class, который идентичен тому, который создается, когда Test2 определяется следующим образом:

public class Test2 {
  public void m() {
  }
}  

Это означает, что вы могли бы изменить реализацию, чтобы быть естественной, чистой java, чистой оболочкой java для собственного частного метода, в любой момент времени, не затрагивая пользователей. Может возникнуть вопрос о том, должна ли общая функция публичного API быть родной, а не только частью вычисления, но опять же, которую можно изменить в любой момент.