2012-03-01 5 views
-2

У меня есть эта кодировка внутри моего java-файла. Этот код в основном принимает целочисленное значение и задает значение обугленного для объектаJava: есть ли способ улучшить этот код?

Student st = new Student(); 

if (attributeName.equals("Grade")) { 
    int sidevalue = Integer.parseInt(attribute.getValue()); // This returns an int value , and this value needs to be converted into char later as shown 
    if(sidevalue==1) 
     st.grade=1; 
    else if(sidevalue==2) 
     st.grade=2; 
    else if(sidevalue==5) 
     st.grade=3; 
} 


class Student 
{ 
    char grade ; 
} 
+1

Начните с правильного форматирования. –

+0

Что значит улучшить? – fbernardo

+1

использование чехол для ключей – Ved

ответ

2

switchcasecheck here оператор может избежать многократного ifelse отступы!

switch(sidevalue){ 

    case 1: st.grade = 1; 
      break; 
    case 2: st.grade = 2; 
      break; 
    case 5: st.grade = 3; 
      break; 
    default: break; 
} 

Там нет существенной разницы исполнения в беге между if-else и switch. Наблюдаемые различия могут быть связаны с пространством выборки конкретного кода, который вы используете.

В небольшом фрагменте кода, который вы предоставляете, нет лучшего выбора, за исключением того, что инструкция switch обеспечивает улучшенную читаемость.

Проверить эти ссылки для получения более подробной информации:

+0

Большое спасибо, может кто-нибудь, пожалуйста, дайте мне знать, используя Switch over, если еще что-то улучшает производительность? – Pawan

+0

@ yyyi777 проверить изменения по моему ответу – Matteo

1

Посмотрите в диспетчерскую ключевое слово switch. Это несколько облегчит этот стиль кодирования.

1

Лучший способ улучшить этот код, чтобы написать тест для него.

Проблемы на данном этапе: «класс» должен быть закрытым. Оценка - это, вероятно, объект первого класса.
Как вы планируете поддерживать другие классы? Скажите 4 или 6? Что произойдет, если значение sidevalue вернется с недопустимым значением?

3

Вы можете использовать карту

Map<Integer, Integer> gradeMappings = new HashMap<Integer, Integer>(); 
gradeMappings.put(1,1); 
gradeMappings.put(2,2); 
gradeMappings.put(3,5); 

if (attributeName.equals("Grade")) { 
    int sidevalue = Integer.parseInt(attribute.getValue()); 
    st.grade = gradeMappings.get(sidevalue); 
} 

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

4
  • Integer.parseInt генерирует исключение, если имя атрибута не является числом. Поймайте его и обработайте ошибку.
  • Student класс должен быть обнародован и перейти в отдельном Java файл
  • Поле grade должно быть int (ваши попутные номера)
  • В качестве альтернативы - если вам нужно хранить символы, возможно, придется сказать st.grade = '1'; (передать '1' вместо 0x01)
  • поле grade должно быть частным, использовать getGrade и setGrade методы, чтобы прочитать написать свойство
  • Я не понимаю значение слова «sidevalu e "- если он не имеет хорошо известного смысла в контексте доменов, рассмотрите его переименование.
  • локальной переменной st должен быть переименован в student
  • if-else-if цепь может быть заменена switch-case заявление.
-1

1) Начните использовать форматы кодирования. Целесообразно использовать objStudent, а не некоторую 'st'.

2) Нет необходимости создавать int sidevalue. Непосредственно использовать кожух переключателя, как дать ниже:

switch(Integer.parseInt(attribute.getValue())) 
{ 
    case 1: 
    ---- 
. 
. 
. 

и так далее ...

} 
+1

Я не думаю, что «objStudent» рекомендуется вообще. Такое венгерское обозначение должно быть обескуражено. – duffymo

+0

Я узнал об этом на сайтах, которые поощряли такое обозначение, чтобы не было какой-либо двусмысленности, ссылающейся на объекты классов. –

+0

Можете ли вы показать мне сайт, который говорит выше. Я бы предпочел бы исправить себя, если бы я был не так все время об именовании объектов класса. Надеюсь, что у вас появятся причины для ваших комментариев или еще почему вы публикуете его? Поддержите свое заявление на некоторых сайтах, которые так говорят. –

0

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

Student st = new Student(); 
st.setGrade(Integer.parseInt(attribute.getValue())) 

class Student{ 
    private char grade ; 

    public setGrade(int sidevalue){ 
     if(sidevalue==1) 
      grade=1; 
     else if(sidevalue==2) 
      grade=2; 
     else if(sidevalue==5) 
      grade=3; 
     else 
      throw new IllegalArgumentException(); 
    } 

    public char getGrade(){ 
     return grade; 
    } 
} 
0

Если у вас есть канонические значения строки, хранящиеся в attribute.getValue(), то вы можете удалить целое синтаксическим и просто сравнить строки значения

String sidevalue=attribute.getValue() 

if(sidevalue=="1"){ 

}else if(sidevalue=="2"){ 

}... 

Обратитесь к методу String.intern для более подробной информации. Это поможет повысить производительность вашей программы.