Частные члены в Java - PullRequest
       28

Частные члены в Java

4 голосов
/ 12 мая 2011

Отличаются ли приватные члены в Java от приватных членов других языков программирования?Потому что я был удивлен, что мог просто передать объект некоторого типа в CompareTo, а затем получить доступ к закрытым членам этого объекта, не используя getMethod.

Например,

public class Foo implements Comparable<Foo>{

    private int bar;

    public Foo() { bar = 1; }

    public int compareTo(Foo o) {
        if(bar == o.bar)
            return 0;
        return 1;
    }
}

Ответы [ 4 ]

10 голосов
/ 12 мая 2011

Да, закрытые члены в Java отличаются от некоторых других языков. Например, я не думаю, эквивалентный код на C ++ будет действительным.

С другой стороны, это будет допустимо в C #. Между C # и Java все еще есть некоторые различия в плане доступа к закрытым членам из вложенных или вложенных классов, но они в основном похожи.

Не стоит ожидать, что два языка будут иметь одинаковое поведение. Стоит обратиться к спецификации языка, который вас действительно интересует - в данном случае это раздел 6.6 JLS .

3 голосов
/ 12 мая 2011

Несмотря на то, что я прожил Java на протяжении 11 лет, я был в шоке, когда обнаружил этот факт два (!) Года назад.Должно быть, я читал это раньше, но почему-то это никогда не запало. Я согласен, что сначала это кажется странным, но когда вы думаете об этом немного дольше, это имеет смысл.

Что такое ОО?О разделении проблем и сокрытии информации, верно?Так что в своем дизайне вы всегда (должны) стараться избегать необходимости «знать» о вещах вне вашей собственной заботы, потому что это равносильно предположениям;вещи, которые вы «знаете» во время разработки, могут позже измениться и опровергнуть предположение, которое делает ваш класс.

В этом случае вы разрешаете Foo получить доступ к личному бару другого Foo, который сначала ощущается как «знание» о чем-то, что не касается Foo.Но поскольку мы говорим о двух экземплярах одного и того же класса (Foo), это на самом деле не наша забота!Например, если мы изменили значение bar с int на double, мы сделаем это в одном и том же классе, и любые ошибки компиляции будут обнаружены немедленно.

Кроме того, представьте, что этот тип доступа был запрещен.Так что, если Foo вызвал свой собственный CompareTo, передав «this» в качестве аргумента?Тогда мы должны запретить Foo доступ к его собственному приватному бару?А как насчет частных статических полей?Это было бы очень запутанно, вы не согласны?

Возможно, немного скучно, но я надеюсь, что вы сможете оценить, что после первого шока это действительно имеет смысл!(-:

1 голос
/ 12 мая 2011

Я мог бы просто передать Объект какого-то тип для сравнения

Вы не сделали. Вы передали объект типа Foo в CompareTo (). Правила Java разрешают доступ к любому члену любого Foo внутри класса Foo. C ++ более ограничен тем, что вы можете получить доступ только к закрытым членам вашего Foo.

1 голос
/ 12 мая 2011

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

Возможно, вы можете думать об объектах того же самогокласс как близнецы, которые делятся друг с другом всем, но скрывают большинство вещей от всех остальных.

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