2014-12-31 2 views
0

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

Класса инвариантных ограничивает состояния хранящегося в объекте.

Итак, если я правильно понял, инварианты не применяются к объектам без гражданства, потому что ограничений нет. Это верно? Я ошибаюсь? Я сравниваю яблоки с апельсинами?

+2

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

+1

Интуитивно, нет. Если у вас нет состояния, то вы не сможете применить инварианты к классу. Какие инварианты вы могли бы сделать, когда не было государства для выполнения условий? –

ответ

0

инвариант будет что-то вроде:

myBankAccount.Balance >= 0 между вызовами к любому из (mybankAccount) методов объекта. Переменная Balance является членом объекта myBankAccount.

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

0

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

public class MyClass { 
    public static final int number = 1; 
    private final int count = 1; 
} 

Это означает, что число/кол не изменится, и будет оставаться последовательной, независимо от того отнесено «N» числа потоков ,

Хотя, если я взять класс с сказать, частное поле и в настоящее время говорят, что доступ к сеттер/геттер, то она будет выглядеть следующим образом:

public class MyInvariantClass { 
    private int number; 

    public int getNumber() { 
     return number; 
    } 
    public void incrNumber() { 
     this.number++; 
    } 
    public void setNumber() { 
     this.number = number; 
    } 
} 

Этот класс MyInvariantClass, имеет состояние с номером поля. Подумайте, что этот объект передается нескольким потокам. Некоторые могут увеличивать его, некоторые могут установить его. Гарантирует ли это, что число, которое мы используем, никогда не выходит из диапазона int и там по умолчанию отрицательно? Поэтому здесь мы не поддерживаем инвариант целого числа при переполнении.

+0

Почему вы фокусируетесь на многопоточности? Я не думаю, что инварианты особенно значимы с несколькими потоками, не так ли? – user4408343

+0

Нет, вы не правы. Но просто говорят, что даже когда вы вызываете метод incrNumber, тогда вы также не гарантируете, что он переполнится и вернется к отрицательному числу. – SMA

0

Класс без гражданства не имеет членов экземпляра, и поэтому не существует состояния для сохранения.

Из википедии:

В информатике, инвариант является условием, что можно положиться UPoN быть верным во время выполнения программы, или в какой-то части его.

В java эти условия (инварианты) могут быть запрограммированы в ваш код несколькими способами.Вот некоторые из них:

  1. используя окончательное ключевое слово
  2. с помощью Утверждает
  3. исключений метательных
  4. с использованием методов мутаторного

Например, возьмут класс Возраст:

public class Age { 
    private final int age; 

    public Age(int age) { 
     // Use exceptions... 
     if (age < 1) { 
      throw new IllegalArgumentException("Age cannot be less than 1"); 
     } 

     // Or use assertions... 
     assert age > 0; 
     this.age = age; 
    } 

    // A method can be a invariant as well, because it makes sure 
    // member variables cannot be set to an invalid state. 
    public Age changeAge(int age) { 
     assert age > 1; 
     return new Age(age); 
    } 
} 

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

Некоторые языки имеют концепцию инвариантов, построенных справа. На странице wikipedia, с которой вы связались, в них приводятся примеры D и Eiffel. Это означает, что вместо того, чтобы создавать исключения, условия утверждения и проверки, вы можете определить ограничение (инвариант) в одном месте, а язык имеет поддержку, чтобы убедиться, что переменные экземпляра остаются в пределах установленных ограничений. В java вы должны сделать это «вручную».

Смежные вопросы