Поля в интерфейсах - PullRequest
       3

Поля в интерфейсах

46 голосов
/ 25 февраля 2012

У меня есть основной вопрос в Java, но это общий вопрос в ООП. Почему интерфейсы позволяют устанавливать поля? Разве это не противоречит тому, что должен делать интерфейс?

В моем понимании, интерфейс - это то, что в английском языке будет прилагательным. Итак, если мой класс реализует интерфейсы Runnable и Serializable, я гарантирую пользователю, что мой класс будет удовлетворять условиям, чтобы они были Runnable и Seriablizable. Однако это означало бы, что интерфейсы не сохраняют состояния, но им разрешено иметь поля в Java ...

Я что-то упустил?

Ответы [ 4 ]

55 голосов
/ 25 февраля 2012

Все поля в интерфейсе public static final, т.е. они являются константами.

Обычно рекомендуется избегать таких интерфейсов, но иногда вы можете найти интерфейс, который не имеет методов и используется только для хранения списка постоянных значений.

20 голосов
/ 25 февраля 2012

Прежде всего, существует разница между парадигмой ООП и реализацией ООП в Java , поэтому одни и те же слова могут означать немного разные вещи.

В ООП интерфейсом парадигмы является то, что вы можете сделать с объектом (или что объект может сделать для вас ).Любой объект может иметь несколько интерфейсов и, следовательно, играть разные роли.Например, кто-то может работать программистом и иметь возможность создавать программы, но в то же время он может быть мужем и отцом и, таким образом, иметь возможность оплачивать счета за свою семью и заботиться о детях.Здесь «программист», «муж» и «отец» - это интерфейсы, а человек - это объект, который их реализует.Обратите внимание, что интерфейсы не подразумевают наличие каких-либо определенных функций (полей) для реализации объекта, а только действия, которые этот объект должен быть в состоянии выполнить.

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

Но как насчет констант (public final static полей)?Являются ли они частью реализации или интерфейса.Это может быть как.Например, интерфейс «программист» может иметь постоянную WORK_HOURS, установленную на «8».Таким образом, Java позволяет вам также описывать константы в интерфейсах.

Обратите внимание, что Java только помогает вам создавать хороший ООП-проект, но в этом сильно не нуждается.В частности, не все публичные методы объекта должны также существовать в интерфейсе.Например, методы getter и setter обычно являются открытыми, но на самом деле они являются частью реализации , а не интерфейсом, и поэтому их не стоит вводить в интерфейс.

(Обратите также внимание, что большинство вещей, которые я здесь описал, относится к ООП основного направления, как в Java, но есть и другие виды ООП, например, основанные на прототипах, в частности реализованные в JavaScript).

4 голосов
/ 25 февраля 2012

Что если этот интерфейс ссылается на константы? Разве не было бы естественно объявить их в интерфейсе?

interface IdFinder {
    Serializable UNSAVED = new Serializable() {};

    /** @returns the given entity's persistent identity, 
                 or {@link UNSAVED} if it hasn't been saved yet, 
                 or null if o is a value object that hasn't a 
                 persistent identity of its own.
     */
    Serializable getId(Object o);
}
2 голосов
/ 25 февраля 2012

Да, у вас могут быть постоянные поля в интерфейсах, но вы правы, когда говорите, что «кажется, что это противоречит тому, что должен делать интерфейс», поскольку это не очень хорошая практика.Почему вы хотите, чтобы все ваши классы реализовывали интерфейс с одинаковыми константами?Вы можете просто иметь их в классе, который их использует, или, если вам действительно нужно как-то их экспортировать, иметь их в отдельном классе, например, так:

public class Constants {
    private Constants() { }

    public static final int ZERO = 0;
    public static final int SOME_COMPLEX_NUM = 2124132L;
    ...
}

У вас также есть перечисления, если вам нужнопредставляют набор константных полей с некоторым значением.Я не вижу ни одного «варианта использования», когда вам на самом деле нужны константы в интерфейсе.Но может и ошибаться:)

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