假設我們只有一個簡單的對象Person,它具有用於標識它的int ID。我如何爲每個Person的新實例賦予新的ID值(+1),但是在該Person類的構造函數中? (我用這個沒有DB)如何在創建對象時在構造函數中自動分配變量
回答
使用靜態AtomicInteger
:
final class Foo {
private static final AtomicInteger seed = new AtomicInteger();
private final int id;
public Foo() {
this.id = seed.incrementAndGet();
}
}
在這裏看到更多的信息:https://stackoverflow.com/a/4818753/17713
使用靜態變量;靜態變量不會綁定到類實例,而是直接綁定到類。
實施例(在C#):
public class Person{
public static int Increment = 1;
public int ID;
public Person(){
this.ID = Increment;
Increment++;
}
}
這樣,所有的類實例將具有唯一的ID-S(增加1)。
編輯:這種方法不是線程安全的,請參閱@Mudu的答案。
除了不是線程安全的,也不是具有公共變量的好主意,也不是遵循Java命名約定。 –
請記住,這不是線程安全的,但只要不使用多線程就沒有問題。 –
該解決方案沒有考慮到'Person'構造函數的線程調用。 –
你應該使用類似這是共享accros的所有實例
public class YourClass {
private static int generalIdCount = 0;
private int id;
public YourClass() {
this.id = generalIdCount;
generalIdCount++;
}
}
使用靜態計數場Person
:
class Person {
private static int nextId = 1;
private final int id;
Person() {
id = nextId++;
}
}
您可以爲當前計數器值的靜態變量,創建時賦值給該ID ...
public class Person {
// same across all instances of this class
static int currentCounter = 0;
// only for this instance
int personId;
public Person(){
personId = currentCounter;
currentCounter++;
}
}
與Luka的建議一樣,這不是線程安全的。 –
是的。我認爲它取決於作者選擇最適合其上下文的答案,儘管像@Mudu這樣的線程安全答案將允許所有上下文無關。感謝您的反饋意見。 – wattostudios
- 1. 在構造函數中創建變量
- 2. 在構造函數中創建對象
- 3. 如何在構造函數中創建一個本地構造函數變量
- 4. 通過構造函數在對象中傳遞變量創建對象
- 5. 如何避免在創建對象時調用構造函數?
- 6. 在構造函數中創建的對象變爲空
- 7. 如何在構造函數調用方法中創建變量?
- 8. 在構造函數中動態分配新的對象
- 9. 如何在模塊中創建JavaScript對象構造函數?
- 10. 如何使用在構造函數中創建的對象
- 11. 對象創建變量構造值
- 12. C++的構造函數自動變量分配
- 13. 如何使用在子構造函數中創建的對象構造父類
- 14. 如何在構造函數的原型不是對象時創建對象?
- 15. C++爲什麼不能在構造函數中分配創建的對象?
- 16. 在對象引用變量使用自定義構造函數
- 17. 堆分配對象構造函數
- 18. 在構造函數中爲每個創建的對象更改類變量
- 19. 在TypeScript中手動和自動分配構造函數參數
- 20. 如何創建一個構造函數在javascript中創建構造函數?
- 21. 如何在構造函數中創建需要自己的對象? (PHP)
- 22. 構造函數創建const對象
- 23. C++對象創建和構造函數
- 24. 從構造函數創建對象
- 25. Digester 3在創建對象時調用構造函數兩次
- 26. 爲什麼在創建對象時調用構造函數?
- 27. 無法在模型構造函數中分配變量值
- 28. 如何在創建對象數組時避免默認的構造函數?
- 29. 我們可以中斷在構造函數中創建對象
- 30. 如何在構造函數爲private時動態創建FMOD :: Sounds?
@木瀆-S的回答是線程安全的,而其他所有的答案(這是確切的重複,包括我的答案,儘管我的第一)不是。 –