Member 13771743 Ответов: 2

Запрос помощи относительно правильного дизайна кодирования


Привет всем, я здесь сегодня не для того, чтобы спросить, правильно ли работает мой код . Я здесь, чтобы спросить, правильно ли я это делаю и следую ли правильным правилам кодирования java . Я был в других местах и местах, где они упоминали, что я плох в этом и плох в том, что я уже знаю, что хочу стать лучше.С учетом сказанного я перейду к вопросу.

Я думаю, что знаю свою базовую java(под базовой java я имею в виду, как сделать простое кодирование, но не говорю, Почему мы использовали это вместо того, чтобы делать это так)

Итак, если я начну, то где и почему мы делаем переменные статичными ? теперь я знаю, что это для инкапсуляции . Что делать, если у меня есть 2 класса, и я инициализирую что-то внутри одного класса, а затем хочу получить доступ к тому значению, которое я присвоил ему внутри другого класса ? или внутри другого метода ? делаю ли я их статичными ? или пример. Что делать, если я хочу использовать некоторые переменные, которые я назначил в одном классе в другом, могу ли я использовать сеттеры и геттеры ? вот что я сделал , я знаю, что есть проблемы с кодированием, так как я пошел и погуглил обо всем, что я должен и не должен делать . Мне просто нужно подтверждение
class Character{


    private static int name=null;
    private static age=0;
    private static String class_name=null;
    private static double hitPoints = 0;
    private static int[] stats = {1,2,3,4,5,6}
    
   
    public static int[] getStats() {
        return stats;
    }


    public static String getClass_name() {
        return character_class;
    }



    public static double getHitPoints() {
        return hitPoints;

      }
     public void getvalues() {

       
            Scanner sc = new Scanner(System.in);
            System.out.print("Enter  Name:");
             name= sc.next();
            System.out.print("Enter Your age:");
            age = sc.nextInt();
            System.out.println("Enter your hitpoints");
            hitpoints=sc.nextInt();

class Main{


         public void display(){

         System.out.println("Your name is :"+name);
         System.out.println("Your age is  :"+age);
         System.out.print("Your hitpoints :"+hitpoints);

         for(int i=0;;i<6;i++){
         System.out.print("Your array is :"+stats[i]);
         }
}
public static void main(String args[]){

   Character c1=new Character();
   c1.getvalues();
   display();


}

}


Here i am trying to get some values in one class, and then print it using another class. I am using getvalues to get the user inputs and then use display() to print it out.Obviously this is not my project and mine is to create a game. Which is alot bigger but basically can say its the same concept . Either way what i want to know is the use of static and the getters . Am i doing it right, white needs to be changed within the concept(Please note that this code is not checked if it is working or not since that is not what i am looking for i just want to know f the concept is write as in the coding patterns and segments. Ignore if anything is wrong or if it doesnt compile.

Спасибо вам всем за то, что нашли время.

Что я уже пробовал:

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

2 Ответов

Рейтинг:
7

Jochen Arndt

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

Когда - или если все это - использовать статические члены зависит от того, что вы хотите сделать. Если вы не уверены, избегайте их. Примером использования статических членов может быть класс который использует одноразовую инициализацию для значений которые не изменяются во время выполнения например разрешение экрана:

class SomeClass {
    private static boolean initialised;
    private static int width;
    private static int height;
    
    public SomeClass() {
        // Called the first time
        if (!initialised)
        {
            width = getScreenWidth();
            height = getScreenHeight();
            // Will never execute this block again
            initialised = true;
        }
    }
}

При наличии статических переменных-членов вы также должны сделать функции getter и setter статическими. Хотя это и не совсем необходимо он позволяет использовать их без наличия экземпляра класса:
// Works always
Character c1 = new Character();
double points1 = c1.getHitPoints();
// Works only when getHitPoints() is static
double points2 = Character.getHitPoints();

В вашем случае менять stats член до единого int и создайте несколько экземпляров класса:
Character characters = new Character[6];
for (int i = 0; i < characters.length; i++) {
    // Now the user input will not overwrite the previous data anymore
    characters[i].getValues();
}
// The display() function has to be changed to display(Character[] characters)
//  and loop through the array items.
display(characters);
Если некоторые члены являются постоянными для всех экземпляров, вы можете сделать их статическими. Но в вашем примере их нет.


Member 13771743

@jocen я знаю об использовании double points2=character.getHitpoints();
what i am asking is in the above one lets say i am prompting the user to enter 10 values for "10 different skills" so here i can use a for-loop or i can use 10 variables or i can store all of these inputs in an array. Lets say i did this in the character class as i have mentioned above. What if i want to use them inside another class ? is it correct for me to define those 10 variables (assuming i am using 10 variables instead of an array and what not) static so i can access them inside the other class ? Or assume i am using the array to store them is it correct for me to define the array out side an method(basically right after defining the class exactly like v done in the example) so i can use it inside another class ? if not how should i go about doing so ? is setters and gettes an option ? lets say i wanted to get this array values printed but those are inside a method in another class? is it correct for me to define them like iv done ? if not please explain how i should do so by using the example i have provided.
private static int [] arr={1,2,3}

Уже не первый раз

Jochen Arndt

Если вам нужно сохранить 10 различных навыков, вы можете использовать массив в качестве члена класса. Если вам нужно получить доступ к нему из другого класса (или другого экземпляра того же класса), вы должны использовать функции getter и setter, используя указатель или ссылку на экземпляр класса.

Но не делайте их статичными, если в этом нет необходимости.

Рейтинг:
2

HobbyProggy

В качестве первого объяснения статики и "не-"статики.
Статический класс не нуждается в экземпляре и будет создан без необходимости создавать его с помощью "MyClass class = new MyClass()".
Думайте об этом как о конфигурации или, возможно, игровом движке, где просто не было бы смысла создавать его экземпляры. Это в основном дизайнерское решение.
Так что статичные вещи всегда доступны

"Обычный" класс всегда нуждается в экземпляре, прежде чем вы сможете его использовать. Это означает, что вы можете создать несколько его экземпляров. Например, вы можете "улучшить" своего персонажа, имея несколько объектов статистики ("статистика класса"), и каждый из них содержит разные значения одного и того же типа вместо использования массива.

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

И вы не должны делать геттеры/сеттеры статичными, вы хотите получить значения вашего текущего экземпляра, и поэтому не имеет смысла делать их статичными.

Если у вас есть еще какие-то вопросы, не стесняйтесь задавать, надеюсь, я вам немного помог.


Member 13771743

@jocen я знаю об использовании double points2=character.getHitpoints();
what i am asking is in the above one lets say i am prompting the user to enter 10 values for "10 different skills" so here i can use a for-loop or i can use 10 variables or i can store all of these inputs in an array. Lets say i did this in the character class as i have mentioned above. What if i want to use them inside another class ? is it correct for me to define those 10 variables (assuming i am using 10 variables instead of an array and what not) static so i can access them inside the other class ? Or assume i am using the array to store them is it correct for me to define the array out side an method(basically right after defining the class exactly like v done in the example) so i can use it inside another class ? if not how should i go about doing so ? is setters and gettes an option ? lets say i wanted to get this array values printed but those are inside a method in another class? is it correct for me to define them like iv done ? if not please explain how i should do so by using the example i have provided.
private static int [] arr={1,2,3}

Уже не первый раз

HobbyProggy

Или вы можете использовать класс статистики и сделать массив или список из него, добавив каждое значение пользователем. Затем вам просто нужны геттеры и сеттеры, чтобы установить или получить значения из вашей статистики. Если это не совсем необходимо, избегайте статики!