创建一个在java中使用的类?
我是Java新手(在python之后)。还有一个关于使用一个类而不创建新实例的问题。这段代码有效,但这样做是好习惯还是坏习惯创建一个在java中使用的类?,java,Java,我是Java新手(在python之后)。还有一个关于使用一个类而不创建新实例的问题。这段代码有效,但这样做是好习惯还是坏习惯 class TestStatic { private static String url; private static String user; TestStatic(String _url, String _user) { url = _url; user = _user; } static
class TestStatic {
private static String url;
private static String user;
TestStatic(String _url, String _user) {
url = _url;
user = _user;
}
static void print() {
System.out.println(url);
System.out.println(user);
}
}
public class Main {
public static void main(String[] args) {
new TestStatic("HTTP", "USER");
TestStatic.print();
// TestStatic test = new TestStatic("HTTP", "USER");
// test.print();
}
}
new TestStatic("HTTP", "USER");
或者我需要注释main方法中的前两个字符串,然后取消注释下两个字符串,并在这样的代码中使用它们
class TestStatic {
private static String url;
private static String user;
TestStatic(String _url, String _user) {
url = _url;
user = _user;
}
static void print() {
System.out.println(url);
System.out.println(user);
}
}
public class Main {
public static void main(String[] args) {
new TestStatic("HTTP", "USER");
TestStatic.print();
// TestStatic test = new TestStatic("HTTP", "USER");
// test.print();
}
}
new TestStatic("HTTP", "USER");
你想用这个做什么
您已经在一个静态类中创建了一个静态方法,可以在不创建TestStatic实例的情况下访问该静态类
TestStatic.print();
上面这一行很好,但是您的变量需要是静态的,请不要在构造函数中设置它们。不需要创建test static的新对象,因为您对它不做任何操作,而且它可能在创建后不久就进入垃圾收集
大多数人将静态类用于实用程序函数。您可以了解何时使用静态类以及何时不使用它们
在澄清您的问题之后,在为整个项目创建一个类以将其连接到SoniqMQ时,您最好使用单例模式
单例模式强制您只创建类的单个对象,您可以在整个项目中使用它
public class MySingleTon {
private static MySingleTon myObj;
private MySingleTon(){
//Empty private constructor
}
public static MySingleTon getInstance(){
if(myObj == null){
myObj = new MySingleTon();
}
return myObj;
}
public void getSomeThing(){
// do something here
System.out.println("I am here....");
}
public static void main(String a[]){
MySingleTon st = MySingleTon.getInstance();
st.getSomeThing();
}
}
这绝对不是使用类和静态变量的方式。这完全取决于您希望如何使用特定类。如果希望在所有实例中都有相同的变量,或者根本没有实例,则应如下使用:
class TestStatic {
private static String url;
private static String user;
static void print() {
System.out.println(url);
System.out.println(user);
}
public static setUrl(String url){
TestStatic.url = url;
}
public static setUser(String user){
TestStatic.user = user;
}
}
public class Main {
public static void main(String[] args) {
TestStatic.setUrl("HTTP");
TestStatic.setUser("USER");
TestStatic.print();
}
}
class TestStatic {
private String url;
private String user;
public TestStatic(String url, String user) {
this.url = url;
this.user = user;
}
public void print() {
System.out.println(url);
System.out.println(user);
}
}
public class Main {
public static void main(String[] args) {
TestStatic test = new TestStatic("HTTP", "USER");
test.print();
}
}
因此,您根本不必创建实例。请记住,所有实例的静态变量都会更改,并且不需要任何实例来访问/更改它们
如果希望每个实例的变量不同,则应按如下方式处理:
class TestStatic {
private static String url;
private static String user;
static void print() {
System.out.println(url);
System.out.println(user);
}
public static setUrl(String url){
TestStatic.url = url;
}
public static setUser(String user){
TestStatic.user = user;
}
}
public class Main {
public static void main(String[] args) {
TestStatic.setUrl("HTTP");
TestStatic.setUser("USER");
TestStatic.print();
}
}
class TestStatic {
private String url;
private String user;
public TestStatic(String url, String user) {
this.url = url;
this.user = user;
}
public void print() {
System.out.println(url);
System.out.println(user);
}
}
public class Main {
public static void main(String[] args) {
TestStatic test = new TestStatic("HTTP", "USER");
test.print();
}
}
请注意,您没有将静态变量用于实例特定的值
有关静态变量和方法的更多信息,请参阅
正如我在您对Farhan Qasim的回答的评论中所读到的,您的用例(正如他所提到的)将需要一个单例模式。只需用谷歌搜索它是什么,它做什么,或者只需点击。正如每个答案中所说的,并且喜欢所有的评论。不要混合使用静态和实例初始化。如果仍要分配
url
和user
,则可以为此创建一个静态
方法:
final class TestStatic {
private static String url;
private static String user;
private TestStatic(){}
static void initialize(String _url, String _user) {
url = _url;
user = _user;
}
static void print() {
System.out.println(url);
System.out.println(user);
}
}
public class Main {
public static void main(String[] args) {
TestStatic.initialize("HTTP", "USER");
TestStatic.print();
}
}
我还将类设置为final,并将其构造函数设置为私有。防止类的任何实例化
TestStatic
。因为它不使用,只保存静态值。非常糟糕,每次创建新的TestStatic
,静态字段都会被覆盖。通过构造函数设置静态
字段通常是不鼓励的,因为您不实例化静态类。这看起来像是XY问题,你想达到什么目的?没有理由这么做。只需将其创建为常规的非静态对象并传递引用即可。这导致了一个更加灵活的结构。该模式本身被称为Singleton(尽管看起来略有不同)。但正如所说,通常您不需要也不应该需要它。“静态类”->我在这里没有看到任何。。。静态类仅用于内部类。我想创建一个类来连接到SonicMQ,并在我的代码中全局使用它。这只是一个概念的例子。@Tutunak您最好为类创建一个单例模式。通过singleton模式,只会创建一个对象,您可以对所有项目使用相同的对象。