Java: как иметь глобальные значения внутри класса? - PullRequest
0 голосов
/ 09 апреля 2010

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

import java.util.*;
import java.io.*;

public class TestClass {
        TestClass(String hello){
                String hallo = hello;
                String halloSecond = "Saluto!";
        }
        public static void main(String[] args) {
                TestClass test = new TestClass("Tjena!");
                System.out.println("I want "Tjena!": " + test.hallo);
                TestClass testSecond = new TestClass("1");
                System.out.println("I want Saluto!:" + test.halloSecond);
                System.out.println("I want Saluto!:" + testSecond.halloSecond);

                // How can I get glob.vars like the "Saluto!"?
        }
}

[Требуется разъяснение] Я не могу понять, что GLOB.VARS не используется. Пожалуйста, смотрите код ниже, где вы не можете получить доступ к GLOB.VARS без экземпляра, следовательно, ошибка. Если я гарантирую, что ни один вредоносный код не сможет создать экземпляр, есть ли проблемы с использованием GLOB.vars?

$ javac TestClass.java 
TestClass.java:19: non-static variable hallo cannot be referenced from a static context
  System.out.println("It did not get to the GLOB.VAR: " + hallo);
                                             ^
1 error
$ cat TestClass.java 
import java.util.*;
import java.io.*;

public class TestClass {
        public String hallo;
        public String halloSecond;

        TestClass(String hello){
                hallo = hello;
                halloSecond = "Saluto!";
        }
        public static void main(String[] args) {
                TestClass test = new TestClass("Tjena!");
      System.out.println("It did not get to the GLOB.VAR" + hallo);
        }
}

Ответы [ 6 ]

9 голосов
/ 09 апреля 2010

Я хочу меньше методов.

Ты не должен. Методы не должны измеряться количеством или размером. Они должны существовать, если они несут отдельную ответственность.

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

Это не имеет особого смысла. Я думаю, вам нужно переменные экземпляра

 private String hello;
 private String helloSecond;

 TestClass(String hello){
        hallo = hello;
        halloSecond = "Saluto!";
 }

 public String getHello() { return hello; }
 public String getHelloSecond() { return helloSecond; }

Как иметь глобальные значения внутри класса?

глобальные переменные может быть достигнуто путем определения их static:

public static String var;

Но использовать это очень плохая практика. Вы не должны использовать их.

5 голосов
/ 09 апреля 2010

Глобальные переменные обычно считаются очень плохой идеей. Да, может быть сложно спроектировать ваши классы так, чтобы каждый класс содержал все (или большинство) переменных, которые ему необходимы для работы. Но гораздо сложнее иметь дело с кодом, основанным на глобальных переменных (главным образом потому, что становится очень трудно предсказать, как изменения в одной части кода повлияют на остальную часть).

4 голосов
/ 09 апреля 2010

Я думаю, вы ищете что-то вроде этого:

public class TestClass {
    public final String hallo;
    public static final String halloSecond = "Saluto!";

    TestClass(String hello){
        String hallo = hello;
    }

    public static void main(String[] args) {
        TestClass test = new TestClass("Tjena!");
        System.out.println("I want "Tjena!": " + test.hallo);
        TestClass testSecond = new TestClass("1");
        System.out.println("I want Saluto!:" + test.halloSecond);
        System.out.println("I want Saluto!:" + testSecond.halloSecond);
    }
}

Значение hallo устанавливается в каждом случае TestClass. Значение halloSecond является константой, разделяемой всеми экземплярами класса и видимой для всего приложения. Обратите внимание, что с этим кодом ваш IDE / компилятор, вероятно, выдаст вам предупреждение на test.halloSecond - оно должно быть квалифицировано по имени класса, например TestClass.halloSecond, а не по имени экземпляра.

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

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

В Java все находится внутри класса, поэтому у вас не может быть "классических" глобальных переменных, как в C / C ++. Однако открытый статический член данных по-прежнему является глобальной переменной.

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

2 голосов
/ 09 апреля 2010
import java.util.*;
import java.io.*;

public class TestClass {
        public String hallo;
        public String halloSecond;

        TestClass(String hello){
                hallo = hello;
                halloSecond = "Saluto!";
        }
        public static void main(String[] args) {
                TestClass test = new TestClass("Tjena!");
                System.out.println("I want "Tjena!": " + test.hallo);
                TestClass testSecond = new TestClass("1");
                System.out.println("I want Saluto!:" + test.halloSecond);
                System.out.println("I want Saluto!:" + testSecond.halloSecond);

                // How can I get glob.vars like the "Saluto!"?
        }
}
1 голос
/ 09 апреля 2010

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

import java.util.*;
import java.io.*;

public class TestClass {

        // Instance variables
        public String hallo;

        TestClass(String hello){
          hallo = hello;
        }

        public static void main(String[] args) {
                TestClass test = new TestClass("Tjena!");
                System.out.println("I want Tjena!:" + test.hallo);
                TestClass testSecond = new TestClass("Saluto");
                System.out.println("I want Saluto!:" + testSecond.hallo);
        }
}

Ваш пример на самом деле не предлагает использовать "глобальные" или переменные класса. Просто добавьте слово static. Кроме того, вы затем префикс переменной с именем класса, а не имя экземпляра при ссылке на него:

import java.util.*;
import java.io.*;

public class TestClass {

        // Class variables
        public static String hallo;

        TestClass(String hello){
          hallo = hello;
        }

        public static void main(String[] args) {
                TestClass test = new TestClass("Tjena!");
                // Reference class variable with "TestClass", not "test"
                System.out.println("I want Tjena!:" + TestClass.hallo);
                TestClass testSecond = new TestClass("Saluto");
                System.out.println("I want Saluto!:" + TestClass.hallo);
        }
}

Использовать "константы". Просто добавьте «окончательный» к объявлению. Это означает, что переменные не изменятся, как только они будут объявлены:

import java.util.*;
import java.io.*;

public class TestClass {

        // Class "constants"
        public static final String hallo = "hello";
        public static final String halloSecond = "Saluto!";

        TestClass(){
        }

        public static void main(String[] args) {
                TestClass test = new TestClass();
                // Reference class variable with "TestClass", not "test"
                System.out.println("I want Tjena!:" + TestClass.hallo);
                TestClass testSecond = new TestClass();
                System.out.println("I want Saluto!:" + TestClass.halloSecond);
        }
}
0 голосов
/ 09 апреля 2010

Проблема в вашем «разъяснении» (который кажется совершенно отдельным вопросом) заключается в том, что hallo - это переменная экземпляра, к которой вы пытаетесь получить доступ из статического метода. Статический контент не принадлежит ни одному экземпляру, и было бы невозможно узнать, к какому экземпляру получить доступ. Чтобы исправить это спокойствие кода, объявите переменные также статическими.

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