Объединение Enums

Когда вы объявляете ссылочную переменную (т. е. объект), вы действительно создаете указатель на объект. Рассмотрим следующий код, в котором вы объявляете переменную примитивного типа int:

int x;
x = 10;

В этом примере переменная x является int, и Java инициализирует ее для 0. Когда вы назначаете его 10 во второй строке, ваше значение 10 записывается в ячейку памяти, на которую указывает x.

Но когда вы пытаетесь объявить ссылочный тип, произойдет что-то другое. Возьмите следующий код:

Integer num;
num = new Integer(10);

Первая строка объявляет переменную с именем num, но она не содержит примитивного значения. Вместо этого он содержит указатель (потому что тип Integer является ссылочным типом). Поскольку вы еще не указали, что указать на Java, он устанавливает значение null, что означает «Я ничего не указываю».

Во второй строке ключевое слово new используется для создания экземпляра (или создания ) объекту типа Integer и переменной указателя num присваивается этот объект. Теперь вы можете ссылаться на объект, используя оператор разыменования . (точка).

Exception, о котором вы просили, возникает, когда вы объявляете переменную, но не создавали объект. Если вы попытаетесь разыменовать num. Перед созданием объекта вы получите NullPointerException. В самых тривиальных случаях компилятор поймает проблему и сообщит вам, что «num не может быть инициализирован», но иногда вы пишете код, который непосредственно не создает объект.

Например, вы можете имеют следующий метод:

public void doSomething(SomeObject obj) {
   //do something to obj
}

В этом случае вы не создаете объект obj, скорее предполагая, что он был создан до вызова метода doSomething. К сожалению, этот метод можно вызвать следующим образом:

doSomething(null);

В этом случае obj имеет значение null. Если метод предназначен для того, чтобы что-то сделать для переданного объекта, целесообразно бросить NullPointerException, потому что это ошибка программиста, и программисту понадобится эта информация для целей отладки.

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

/**
  * @param obj An optional foo for ____. May be null, in which case 
  *  the result will be ____.
  */
public void doSomething(SomeObject obj) {
    if(obj != null) {
       //do something
    } else {
       //do something else
    }
}

Наконец, Как определить исключение & amp; причина использования Трассировки стека

27
задан Community 12 September 2008 в 09:14
поделиться

5 ответов

Я верю тому, что Вы хотите, перечисление типа флага.

необходимо добавить, что Флаги приписывают вершине перечисления, и затем можно объединить перечисления с 'Или' ключевое слово.

Как это:

<Flags()> _
Enum CombinationEnums As Integer
  HasButton = 1
  TitleBar = 2
  ReadOnly = 4
  ETC = 8
End Enum

Примечание: числа направо являются всегда вдвое более большими (полномочия 2) - это необходимо, чтобы быть в состоянии разделить отдельные флаги, которые были установлены.

Объединение желаемые флаги с помощью Или ключевое слово:

Dim settings As CombinationEnums
settings = CombinationEnums.TitleBar Or CombinationEnums.Readonly

Это устанавливает TitleBar и Только для чтения в перечисление

Для проверки то, что было установлено:

If (settings And CombinationEnums.TitleBar) = CombinationEnums.TitleBar Then
  Window.TitleBar = True
End If
42
ответ дан Dave Arkell 12 September 2008 в 09:14
поделиться
  • 1
    Что, если Вы can' t вызов call, потому что необходимо записать в stdin процесса, но Вас don' t заботятся о выводе? – Michael 20 July 2014 в 18:34

Можно использовать FlagsAttribute для украшения Перечисления как поэтому, которое позволит Вам объединить Перечисление:

<FlagsAttribute> _
Public Enumeration SecurityRights
None = 0
Read = 1
Write = 2
Execute = 4

И затем называют их как так (класс UserPriviltes):

Public Sub New ( _
    options As SecurityRights _
)

New UserPrivileges(SecurityRights.Read OR SecurityRights.Execute)

Они эффективно объединены (разрядная математика) так, чтобы вышеупомянутый пользователь и Считал И Выполняет все, которые несут вокруг в одной необычной переменной SecurityRights.

Для проверки, чтобы видеть, есть ли у пользователя полномочие, Вы используете И (более поразрядная математика) для проверки пользовательского перечисления значений с Перечисление значений, на которое Вы проверяете:

//Check to see if user has Write rights
If (user.Privileges And SecurityRights.Write = SecurityRigths.Write) Then
    //Do something clever...
Else
    //Tell user he can't write.
End If

HTH, Tyler

3
ответ дан Tyler 12 September 2008 в 09:14
поделиться
  • 1
    С Popen.poll() можно проверить, закончился ли процесс, то можно использовать communicate. Таким образом, можно сохранить параллелизм. – Diego Navarro 14 March 2012 в 17:07

Если я понимаю Ваш вопрос правильно, Вы хотите объединить различные перечислимые типы. Таким образом, одна переменная может сохранить значение от одного из права двух различных перечислений? Если Вы спрашиваете о хранении объединения двух различных значений одного перечислимого типа, можно посмотреть на объяснение Dave Arkell

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

, то Он не сделает для симпатичного кода все же. Я стараюсь не использовать перечисления большую часть времени. Обычно, если Вы позволяете перечислениям размножаться в Вашем коде, это - просто вопрос времени, прежде чем они родят повторные операторы выбора и другие грязные антишаблоны.

1
ответ дан Mendelt 12 September 2008 в 09:14
поделиться
  • 1
    звоните (), ожидает процесса для окончания. Я думаю, что OP хочет породить процессы и сделать что-то еще в родительском процессе, в то время как они работают. – ibz 15 August 2011 в 09:21

Если Вы берущий об использовании перечислимых флагов () существуете хорошая статья здесь .

0
ответ дан Hath 12 September 2008 в 09:14
поделиться

Ключ к комбинации Enum с должна удостовериться, что значение является питанием два (1, 2, 4, 8, и т.д.) так, чтобы можно было выполнить битовые операции на них (|= &=). Те Enum с может быть быть отмеченной с Flags атрибут. Anchor свойство на элементах управления Windows Forms является примером такого управления. Если это будет отмечено как флаг, Visual Studio позволит Вам контрольные числа вместо того, чтобы выбрать единственное в выпадающем в разработчике свойств.

1
ответ дан Toothbrush 12 September 2008 в 09:14
поделиться
  • 1
    Также - если Вы делаете , хотят ожидать дочерних процессов для окончания, можно просто использовать, ожидают () на каждом из них - Вы don' t должен опросить () и удалить их из Вашего списка. Выполнение ожидания () на каждом гарантирует, что Вы ожидаете, пока последний не закончился (если, именно это Вы хотите). – ibz 15 August 2011 в 09:17
Другие вопросы по тегам:

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