service层中的某个函数:
public class ManangeMananger extends ServiceException {
public String TIME;
public void CreateTable() throws Exception{
Date now = new Date();
    DateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHmmss");
    this.setTIME(dateFormat.format(now));
    //this.TIME = dateFormat.format(now);
    System.out.println(TIME);
    String sql = "CREATE TABLE backup_docinfo_"
       +  this.TIME
                + "各个字段";
    ConnectionDB ed = new ConnectionDB();
    try {
ed.ExcuteSql(sql);
} catch (Exception e) {  
e.printStackTrace();
}
}
public String getTIME() {
return TIME;
}
public void setTIME(String tIME) {
TIME = tIME;
}
}
在web层某个函数调用了CreateTable()方法中的TIME变量。
private String backuptime;
private ManangeMananger manangeManager;
public void InsertData() throws Exception{
                  //this.backuptime = this.manangeManager.TIME;
this.backuptime = this.manangeManager.getTIME();
                           ……;
                           ……;
}
public String getBackuptime() {
return backuptime;
} public void setBackuptime(String backuptime) {
this.backuptime = backuptime;
} @Autowired
public void setManangeManager(ManangeMananger manangeManager) {
this.manangeManager = manangeManager;
}我想问的是如果不使用get/set方法传值赋值,而是直接写this.TIME = dateFormat.format(now);这时候TIME有值,但是传过去给backuptime显示的就是null了。这是为什么。直接传值赋值与用get/set传值赋值有什么区别吗?请指教~~

解决方案 »

  1.   

    感觉还是有区别的 set方法就像做了一层封装,里面可能还有根据参数判断赋值或者检查参数或者等等一些其他操作
    这个得看逻辑上哪种符合 有时候需要set的判断就调set 不需要的在当前类里面也应该可以直接访问成员
    第一问你先确定下是不是同一个对象吧 看代码看得头晕 下次记得用“插入源代码”
      

  2.   

    正常是可以的吧,
    关键问题应该出在CreateTable()的调用上,
    this.manangeManager.CreateTable();//加上这句
    this.backuptime = this.manangeManager.TIME;可以取到不?
      

  3.   

    貌似不是静态方法里初始化复制啊。你即使setTIME也是传过去NULL吧
      

  4.   

    在使用上没有区别,怀疑你给TIME复制时ManangeMananger的实例和你获取该值时的实例不是同一个。
      

  5.   

    public String TIME;又不是静态的。
    而你虽然声明了private ManangeMananger manangeManager;
    但你却没有实例化你应new后,在调用CreateTable才会有值吧
      

  6.   

    方法体内部也是直接赋值,也没有其他多余的代码,所以效果上是一样的
    怀疑是不同的ManagerManger对象,所以值不一样
    LZ是怎么传值的?调用setManangeManager方法?
      

  7.   

    我new了一个对象,都调用的同一个对象,但是在传过去的backuptime里接收到的是null,在当前的TIME里是有值的
      

  8.   

    感觉一样,可是结果就是不一样的。get/set就能获得值,而直接调用就不行
      

  9.   

    感觉一样,可是结果就是不一样的。get/set就能获得值,而直接调用就不行
      

  10.   

    我特意new了一个,调用的同一个对象,不行。
      

  11.   

    我调的是setManangeManager方法,这样可以取到值,但是直接用传值的方法就为null
    我new了一个对象试了一下,调用同一对象传过去也为null
      

  12.   

    你是在实例类ManangeMananger 之后调用过SET?还是直接用CreateTable() ?
      

  13.   

    new 了一个,还是没值……
      

  14.   

    在以下情况中,建议使用get/set方法,而不是直接设值或读取:1、get/set方法会固定的对外部传的内容进行一定的逻辑处理再赋给数据成员/固定地处理后传出。比如外面给的是“特工”,在类里面固定地转换成“007”来使用。2、这个类作为被调用对象的时候,由于调用对象约定采用get/set 方式来获取该对象的指定数据成员值,必须写get/set。3、出于对数据成员值的保护,不希望他被外部修改时候(例如防止黑客盗取修改),可以将它设成private,不提供set方法(但可以通过设默认值,或者在构造时候一开始就设定,或在处理其他逻辑时设定),但提供get供外部对象获取。相应的,如果不希望他被外部知道具体是什么值的时候(例如加密),可以将它设成private,不提供get方法,只提供set供外部对象传入初始值,在set方法里调整成希望的数据成员值。
    --------------------------------对于直接访问TIME,以及get/set得到的值有差异的情况,可能还需要把你现在写的调用的过程拿出来看一下,才能做更多的判断。确实可能存在不是同一对象的情况。
      

  15.   

    不好意思,没太明白你的意思。web层Action里调用了service层Manangemananger 的CreateTable()方法,在CreateTable()方法中写的TIME的get/set方法.在Action中调用this.backuptime = this.manangeManager.TIME就取不到值(为null),而用this.backuptime = this.manangeManager.getTIME()就可以取到值。我这样写清楚么?
      
      

  16.   

    如果你定义了 public 就没什么区别的了。 
    set赋值和 直接赋值的区别就是  private   和  public 的区别。 
      

  17.   

    能把相关源代码发来研究一下否? 鄙人邮箱 [email protected]
      

  18.   

    你是在set给全局变量赋值的,返回当然有值,直接取时,效果当然一样,但你没有为其变量赋值,至少你想直接用,先要直接赋值吧
      

  19.   

    TIME变量是ManangeMananger类的变量,你只是调用了ManangeMananger中的getTime()方法,并没有调用CreateTable()方法中的this.setTIME(dateFormat.format(now));,所以没有给time赋值,在web层某个函数调用了中的TIME变量this.backuptime = this.manangeManager.getTIME();也就为null。要不然就是
    @Autowired
    public void setManangeManager(ManangeMananger manangeManager) {
    this.manangeManager = manangeManager;
    }传递的manangeManager并不是你在web层某个函数调用了CreateTable()方法的那个对象
      

  20.   

    应该可以取到值 怎么没看到你调用CreateTable() 方法的代码
      

  21.   

    TIME变量是ManangeMananger类的变量,你只是调用了ManangeMananger中的getTime()方法,并没有调用CreateTable()方法中的this.setTIME(dateFormat.format(now));,所以没有给time赋值,在web层某个函数调用了中的TIME变量this.backuptime = this.manangeManager.getTIME();也就为null。要不然就是
    @Autowired
    public void setManangeManager(ManangeMananger manangeManager) {
    this.manangeManager = manangeManager;
    }传递的manangeManager并不是你在web层某个函数调用了CreateTable()方法的那个对象
      

  22.   

    public String TIME;
    你用了public就根本不用写get/set方法。直接访问就可以了。楼主还是先了解一下get/set方法的意义吧。
      

  23.   

    这个做肯定不行啦。在web层某个函数调用了CreateTable()方法中的TIME变量。
    private String backuptime;
    private ManangeMananger manangeManager;
    public void InsertData() throws Exception{
      //this.backuptime = this.manangeManager.TIME;
    this.backuptime = this.manangeManager.getTIME();
      ……;
      ……;
    }你这里面这个manangeManager是新的实力,又不是传过来的。相当于这里面有两个ManangeMananger对象。这就是为什么你那个backuptime是空的。
      

  24.   

    这个跟是不是用Getter / Setter一点关系都没有
      

  25.   


    恩。。这样肯定是没有值得。。这里的manageManager是空需要对这个manangeManager实例化
      

  26.   

    不太清楚嗳,我们一般都是在private下,封装时候才用set()get()的
      

  27.   

    没有什么区别 ,只是set  封装了属性,不让用户看到,只能通过方法来访问属性 ,而不能直接改变属性的值