Объекты инкапсулируют данные так, чтобы даже другие экземпляры того же класса не могли получить доступ к данным?

ncurses использует функцию операционной системы wcwidth для определения ширины символа. Terminal.app предполагает, что U + 1F1FA и U + 1F1F8 используют два столбца, в то время как wcwidth говорят, что они представляют собой только один столбец каждый. Зеленое сердце U + 1F49A рассматривается как wcwidth , так и Terminal.app как двойная ширина. Это можно увидеть, добавив символ до и после символа смайликов: там, где ncurses введен в заблуждение, в результате на экране отображаются перекрывающиеся символы.

illustration of overlap

До Unicode 9 (2016) все эти конкретные коды имеют «нейтральную ширину» в соответствии с файлом Unicode EastAsianWidth. Технический отчет Unicode # 11 Свойство символа Unicode «Ширина Восточной Азии» (с 1999 г.) подразумевает (никогда не дает четкого определения), что фактическая ширина символа «нейтральной ширины» зависит от контекста, т. Е. Если они используются вместе с символами двойной ширины, их следует рассматривать как символы двойной ширины. Например, он говорит

Узкие (и нейтральные) символы всегда отображаются на символы половинной ширины в наборе смешанной ширины

blockquote>

, но ссылаются на «смешанную ширину». «исключительно с точки зрения сочетания символов« полная ширина »(два столбца) и« ширина узкая »(один столбец).

Функция wcwidth обычно (MacOS, вероятно, не исключение) возвращает ту же ширину для данной кодовой точки, игнорируя настройки локали.

В Unicode 8 это соответствующие строки (диапазон значений):

1F1E6..1F1FF;N   # So    [26] REGIONAL INDICATOR SYMBOL LETTER A..REGIONAL INDICATOR SYMBOL LETTER Z
1F400..1F579;N   # So   [378] RAT..JOYSTICK

В Unicode 9 , U + 1F49A «заполнен» width ", но остальные два нейтральны:

1F1E6..1F1FF;N   # So    [26] REGIONAL INDICATOR SYMBOL LETTER A..REGIONAL INDICATOR SYMBOL LETTER Z
1F442..1F4FC;W   # So   [187] EAR..VIDEOCASSETTE

Я не вижу, чтобы они изменились впоследствии, через Unicode 12 (current).

Учитывая все это, это выглядит как ошибка в шрифте и / или wcwidth, которая передается по инерции (мало что вы можете с этим поделать, пока Apple не придет к созданию wcwidth согласен со своими шрифтами).

Кстати, вы можете найти Предложение по использованию ZERO WIDTH JOINER (ZWJ) между двумя символами региональных индикаторов , имеющее отношение к проблеме.

7
задан guerda 27 April 2009 в 06:17
поделиться

7 ответов

I don't tend to think of it in terms of one object having access to another, but rather what code has access to what data within an object.

In Java (and C#, btw) code within a class has access to the private members of any object of the same class. Then you've got package/assembly access and public access.

The tricky one is protected access, which is sort of access to code in subclasses - but it depends on the target object: you're only allowed to access protected members of an object if it's an instance of the same type as the location of the code, or some subclass - even if it's being exposed by a parent class. So for instance, suppose you had:

class Parent
{
    protected int x;
}

class Child1 extends Parent
class Child2 extends Parent
class Grandchild extends Child1

Then within the Child1 code, you can access Parent.x only for objects which are known (at compile-time) to be instances of Child1 or Grandchild. You couldn't, for instance, use new Parent().x or new Child2().x.

9
ответ дан 6 December 2019 в 12:54
поделиться

getName () должна возвращать имя (поле Wheather или какая-то другая «вещь»).

1
ответ дан 6 December 2019 в 12:54
поделиться

Инкапсулируют ли объекты данные, чтобы даже другие экземпляры того же класса не могли получить доступ к данным?

Конечно, если вы не используете статические элементы.

Извлечь из эту ссылку :

Иногда вам нужны переменные, которые являются общими для всех объектов. Это достигается с помощью статического модификатора. Поля, которые имеют в своем объявлении модификатор static, называются статическими полями или переменными класса

0
ответ дан 6 December 2019 в 12:54
поделиться

No, private fields can be accessed even from other instances (within a method of the same class).

They cannot be accessed from subclasses, however, not even within the same instance.

You provide getter methods to allow "outside" code to access fields in your class. Since it is up to you what getters you provide, how visible you make them, and how they are implemented, you can exercise a lot of control as to who can access the data and how.

Note that there does not really need to be a name field if there is a getName: it is entirely up to the implementation of the getter where that data comes from.

Even if the getter (or setter) just wraps a private field, it is good style to have these setters and getters (as opposed to allowing direct field access).

4
ответ дан 6 December 2019 в 12:54
поделиться

Даже если поле / метод является «закрытым», к нему все равно можно получить доступ / вызвать его с помощью отражения, если вы не установите специальный менеджер безопасности, который запрещает это.

1
ответ дан 6 December 2019 в 12:54
поделиться

Что такое "методы доступа" в Java - такие методы, как getName ()?

Да - getFoo () и setFoo () являются методами доступа для «свойства» с именем foo - это часть спецификации JavaBeans . Причина, по которой они предпочтительнее открытых полей, заключается в том, что они позволяют вам иметь только геттер (делая свойство доступным только для чтения), вести дополнительную бухгалтерию (например, вычислять производные поля) и проверять заданные значения (например, выбрасывая PropertyVetoException , когда значение недопустимо).

Все это изначально предназначалось для использования с инструментами графического интерфейса, которые позволили бы вам графически конфигурировать и комбинировать JavaBeans для «создания приложений». Это оказалось несбыточной мечтой, но концепция JavaBeans и свойств оказалась полезной для обычного кодирования и стала широко распространенной.

Многие люди неправильно понимают эту концепцию и считают, что «инкапсуляция» означает просто написание сеттеров и геттеров для частных свойств, а не их публичное использование. - а потом по праву считай, что идиот. Инкапсуляция означает не раскрывать внутреннюю работу класса вообще , за исключением строго контролируемых способов. В хорошем дизайне ОО не должно быть слишком много методов get и очень мало методов set в классе.

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

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

0
ответ дан 6 December 2019 в 12:54
поделиться

Идея инкапсуляции состоит в том, чтобы позволить реализациям различных модулей свободно изменяться. Хотя мы говорим об объектах, для инкапсуляции мы действительно подразумеваем единицу кода. В языках на основе классов единицей кода обычно является [внешний] класс.

Бывает также, что двоичные операции (например, равно) становятся глупыми без доступа внутри одного и того же класса. Таким образом, private означает приватность для класса [outer], а не приватность для того же класса в одном и том же экземпляре.

Методы доступа обычно указывают на плохой дизайн для чего угодно, кроме простых объектов значений (только для получателей). Объекты должны иметь поведение, а не просто глупый набор данных. Переместите код, который был бы снаружи, используя геттеры, в метод, который имеет смысл для объекта. Положа руку на сердце, получатели 99% времени просто возвращают значение поля. Если вы собираетесь добавить метод получения и установки, то сделать поле частным довольно мало.

Единицей кода обычно является [внешний] класс.

Бывает, что бинарные операции (такие как «равно») становятся глупыми без доступа внутри одного и того же класса. Таким образом, private означает приватность для класса [outer], а не приватность для того же класса в одном и том же экземпляре.

Методы доступа обычно указывают на плохой дизайн для чего угодно, кроме простых объектов значений (только для получателей). Объекты должны иметь поведение, а не просто глупый набор данных. Переместите код, который был бы снаружи, используя геттеры, в метод, который имеет смысл для объекта. Положа руку на сердце, получатели 99% времени просто возвращают значение поля. Если вы собираетесь добавить метод получения и установки, то сделать поле частным довольно мало.

Единицей кода обычно является [внешний] класс.

Бывает, что бинарные операции (такие как «равно») становятся глупыми без доступа внутри одного и того же класса. Таким образом, private означает приватность для класса [outer], а не приватность для того же класса в одном и том же экземпляре.

Методы доступа обычно указывают на плохой дизайн для чего угодно, кроме простых объектов значений (только для получателей). Объекты должны иметь поведение, а не просто глупый набор данных. Переместите код, который был бы снаружи, используя геттеры, в метод, который имеет смысл для объекта. Положа руку на сердце, получатели 99% времени просто возвращают значение поля. Если вы собираетесь добавить метод получения и установки, то сделать поле частным довольно мало.

Также бывает, что бинарные операции (такие как equals) становятся глупыми без доступа в пределах одного и того же класса. Таким образом, private означает приватность для класса [outer], а не приватность для того же класса в одном и том же экземпляре.

Методы доступа обычно указывают на плохой дизайн для чего угодно, кроме простых объектов значений (только для получателей). Объекты должны иметь поведение, а не просто глупый набор данных. Переместите код, который был бы снаружи, используя геттеры, в метод, который имеет смысл для объекта. Положа руку на сердце, получатели 99% времени просто возвращают значение поля. Если вы собираетесь добавить метод получения и установки, то сделать поле частным довольно мало.

Также бывает, что бинарные операции (такие как equals) становятся глупыми без доступа в пределах одного и того же класса. Таким образом, private означает приватность для класса [outer], а не приватность для того же класса в одном и том же экземпляре.

Методы доступа обычно указывают на плохой дизайн для чего угодно, кроме простых объектов значений (только для получателей). Объекты должны иметь поведение, а не просто глупый набор данных. Переместите код, который был бы снаружи, используя геттеры, в метод, который имеет смысл для объекта. Положа руку на сердце, получатели 99% времени просто возвращают значение поля. Если вы собираетесь добавить метод получения и установки, то сделать поле частным довольно мало.

Методы доступа, как правило, указывают на плохой дизайн на что угодно, кроме простых объектов значений (только получателей). Объекты должны иметь поведение, а не просто глупый набор данных. Переместите код, который был бы снаружи, используя геттеры, в метод, который имеет смысл для объекта. Положа руку на сердце, получатели 99% времени просто возвращают значение поля. Если вы собираетесь добавить метод получения и установки, то сделать поле частным довольно мало.

Методы доступа, как правило, указывают на плохой дизайн на что угодно, кроме простых объектов значений (только получателей). Объекты должны иметь поведение, а не просто глупый набор данных. Переместите код, который был бы снаружи, используя геттеры, в метод, который имеет смысл для объекта. Положа руку на сердце, получатели 99% времени просто возвращают значение поля. Если вы собираетесь добавить метод получения и установки, то сделать поле частным довольно мало.

1
ответ дан 6 December 2019 в 12:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: