[英]A more elegant way of setting up an object based on other values
首先對這個標題的狀態表示歉意,我不知道我實際上要問的問題是什么,這意味着我不知道要使用的正確術語,因此如果有人可以告訴我我很樂意更改標題或刪除並重新發布。
因此,當前在一個項目中,我必須設置一個值對象,而忽略它是一個realmObject的事實,這無關緊要。
public class Skills extends RealmObject {
private boolean acrobaticsMarked = false;
private int acrobaticsValue;
private final String acrobaticsAbility = "DEX";
private boolean animalHealingMarked = false;
private int animalHealingValue;
private final String animalHealingAbility = "WIS";
private boolean arcanaMarked = false;
private int arcanaValue;
private final String arcanaAbility = "INT";
private boolean athleticsMarked = false;
private int athleticsValue;
private final String athleticsAbility = "STR";
private boolean deceptionMarked = false;
private int deceptionValue;
private final String deceptionAbility = "CHA";
private boolean historyMarked = false;
private int historyValue;
private final String historyAbility = "INT";
private boolean insightMaarked = false;
private int insightValue;
private final String insightAbility = "WIS";
private boolean intimidationMarked = false;
private int intimidationValue;
private final String intimidationAbility = "CHA";
private boolean investigationMarked = false;
private int investigationValue;
private final String investigationAbility = "INT";
private boolean medicineMarked = false;
private int medicineValue;
private final String medicineAbility = "WIS";
private boolean natureMarked = false;
private int natureValue;
private final String natureAbility = "INT";
private boolean perceptionMarked = false;
private int perceptionValue;
private final String perceptionAbility = "WIS";
private boolean performanceMarked = false;
private int performanceValue;
private final String performanceAbility = "CHA";
private boolean persuasionMarked = false;
private int persuasionValue;
private final String persuasionAbility = "CHA";
private boolean religionMarked = false;
private int religionValue;
private final String religionAbility = "INT";
private boolean sleightOfHandMarked = false;
private int sleightOfHandValue;
private final String sleightOfHandAbility = "DEX";
private boolean stealthMarked = false;
private int stealthValue;
private final String stealthAbility = "DEX";
private boolean survivalMarked = false;
private int survivalValue;
private final String survivalAbility = "WIS";
如您所見,它們每個都有一個能力值STR,DEX,CON,INT,WIS和CHA。 是的,這是D&D。 因此,這些值已在另一個類中設置。 我不會粘貼整個類, 您可以在這里找到它,但是它具有以下值,這些值現在已經填寫完畢。
int strength;
int dexterity;
int constitution;
int intelligence;
int wisdom;
int charisma;
目前,我正在設置這樣的值
public void setValues(Abilities abilities) {
this.setAcrobaticsValue(abilities.getDexterity());
this.setAnimalHealingValue(abilities.getWisdom());
this.setArcanaValue(abilities.getIntelligence());
this.setAthleticsValue(abilities.getStrength());
this.setDeceptionValue(abilities.getCharisma());
this.setHistoryValue(abilities.getIntelligence());
this.setInsightValue(abilities.getWisdom());
this.setIntimidationValue(abilities.getCharisma());
this.setInvestigationValue(abilities.getIntelligence());
this.setMedicineValue(abilities.getWisdom());
this.setNatureValue(abilities.getIntelligence());
this.setPerceptionValue(abilities.getWisdom());
this.setPerformanceValue(abilities.getCharisma());
this.setPersuasionValue(abilities.getCharisma());
this.setReligionValue(abilities.getIntelligence());
this.setSleightOfHandValue(abilities.getDexterity());
this.setStealthValue(abilities.getDexterity());
this.setSurvivalValue(abilities.getWisdom());
}
我想知道是否有一種更優雅的方式逐行運行該類,因此它首先遍歷每個類的int值,並在每個類上讀取Skills類中的每個String的Ability值,並通過檢索來設置技能值陳述的來自能力的字符串。 例如。 在讀取到acrobaticsAbility等於DEX時,它會去並獲取Dexterity值。
您應該創建一個具有3個屬性的類異能:標記異能,值異能和(靜態)異能。 該對象將替換每組3個屬性。 然后,您可以更改setValues以處理Ability對象的集合。 也許您只需要一個普通的setter並保持原樣即可。 或者,您可以使用以字符串功能為鍵的地圖。 這樣,您可以使用該鍵找到所需的能力。
您還可以將功能鍵放入枚舉中,例如AbilityType,這可以提高可讀性並減輕可能的錯字。 然后,靜態字符串將是靜態的AbilityType,地圖中的鍵的類型也將是靜態的。
我最好的選擇是在“技能”和“能力”類之間建立關系。
public class Skills extends RealmObject {
// Remove all fields that can be obtained from ability
private Ability ability;
public int getAcrobaticsValue(){
return ability.getWisdom();
}
}
我沒有解決方案,因此可能沒有幫助。 相反,我有一些建議。
技能似乎有幾個“技能”條目。 您可以使用封裝在那里的三個屬性來創建一個Skill類。
然后,您將擁有包含多個技能條目的技能。 取而代之的是,您可以通過“能力”獲得一個技能圖,它可以是字符串常量(靜態最終字符串)或枚舉。
在這一點上,您可以消除Skill類,並通過“能力”獲得一個整數圖。 可以通過注意是否在地圖中找到鍵來替換“已標記”屬性。 但是,保留Skill類允許您向其添加其他屬性。
就簡化setValues()而言,這將涉及沿相同方向重構Abilities,以便您可以遍歷每個Ability並添加一個Skill。
作為粗略結構,請考慮以下內容:
public class Abilities{
enum Ability {DEXTERITY, WISDOM; }//add more
private Map<Ability, Integer> abilities;
public Abilities(){
abilities = new HashMap<>();
}
public int getValue(Ability ability) {
return abilities.get(ability);
}
public void setValue(Ability ability, int value) {
abilities.put(ability, value);
}
}
和:
public class Skills {
enum SkillName{DEX, WIS, INT, STR, CHA;}
private Skill acrobatics;
private Skill animalHealing;
private Abilities abilities;
Skills(){
abilities = new Abilities();
abilities.setValue(Ability.DEXTERITY, 5);
abilities.setValue(Ability.WISDOM, 3);
acrobatics = new Skill(SkillName.DEX, Ability.DEXTERITY, false);
animalHealing = new Skill(SkillName.WIS, Ability.WISDOM, false);
}
public boolean isFlag(Skill skill) {
return skill.isFlag();
}
public void setFlag(Skill skill, boolean flag) {
skill.setFlag(flag);
}
public int getValue(Skill skill) {
return skill.getValue();
}
public void setValue(Skill skill, int value) {
skill.setValue(value);
}
class Skill{
private SkillName name;
private Ability ability;
boolean flag;
Skill(SkillName name, Ability ability, Boolean flag){
this.name = name;
this.ability = ability;
this.flag = flag;
};
public boolean isFlag() {return flag;}
public void setFlag(boolean flag) { this.flag = flag;}
public int getValue() { return abilities.getValue(ability);}
public void setValue(int value) {abilities.setValue(ability,value);}
public String getName() {return name.toString();}
public void setName(SkillName name) {this.name = name; }
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.